]> git.huck.website - metaforge.git/commitdiff
semi-working main()
authorHuck Boles <huck@huck.website>
Wed, 10 May 2023 23:40:14 +0000 (18:40 -0500)
committerHuck Boles <huck@huck.website>
Wed, 10 May 2023 23:40:14 +0000 (18:40 -0500)
.gitignore
src/filetype/builder.rs
src/main.rs
src/tests/test_metafile.rs
test_site/source/sub_dir/sub_source.meta [deleted file]
tests/files/test_source.meta [moved from test_site/source/test_source.meta with 100% similarity]

index 17e283cd95005e5c428249ba54d5865f60c22681..c6888289d0c5697bf33b660652508f14618204d9 100644 (file)
@@ -1,2 +1,2 @@
 /target
-/test_site/site
+/test_site/build
index 55a7405026604b9b58ac845be4346fee553e6c65..adea616b210c987c42c5872fb914460b21d775d6 100644 (file)
@@ -1,5 +1,9 @@
 use crate::{parse_file, MetaFile, Options, Source, Substitution};
-use color_eyre::{eyre::bail, Result};
+use color_eyre::{
+    eyre::bail,
+    eyre::{eyre, WrapErr},
+    Result,
+};
 use pandoc::{InputFormat, InputKind, OutputFormat, OutputKind, Pandoc, PandocOutput};
 use std::{
     collections::HashMap,
@@ -8,13 +12,16 @@ use std::{
 };
 
 pub fn build_metafile(path: &Path, dirs: &Options) -> Result<()> {
-    let file = fs::read_to_string(path)?;
-    let file = parse_file(&file)?;
+    let file = fs::read_to_string(path)
+        .wrap_err_with(|| eyre!("failed to read: {}\n", path.to_string_lossy()))?;
+    let file = parse_file(&file)
+        .wrap_err_with(|| eyre!("failed to parse: {}\n", path.to_string_lossy()))?;
 
-    let html = get_source_html(&file, dirs)?;
+    let html = get_source_html(&file, dirs)
+        .wrap_err_with(|| eyre!("failed converting to html: {}\n", path.to_string_lossy()))?;
 
-    let pattern = get_pattern("base", &file, dirs)?;
-    let mut base = parse_file(&pattern)?;
+    let pattern = get_pattern("base", &file, dirs).wrap_err("failed to get base pattern\n")?;
+    let mut base = parse_file(&pattern).wrap_err("failed to parse base pattern\n")?;
 
     base.variables = file.variables;
     base.arrays = file.arrays;
@@ -22,10 +29,19 @@ pub fn build_metafile(path: &Path, dirs: &Options) -> Result<()> {
 
     base.patterns.insert("SOURCE", &html);
 
-    let output = metafile_to_string(&base, dirs, Some("base"))?;
+    let output = metafile_to_string(&base, dirs, Some("base"))
+        .wrap_err_with(|| eyre!("failed to build: {}\n", path.to_string_lossy()))?;
+
+    let dest = find_dest(path, dirs).wrap_err_with(|| {
+        format!(
+            "could not find destination file: {}\n",
+            path.to_string_lossy()
+        )
+    })?;
 
     // want newline to end file
-    fs::write(find_dest(path, dirs)?, output + "\n")?;
+    fs::write(&dest, output + "\n")
+        .wrap_err_with(|| eyre!("could not write to: {}\n", dest.to_string_lossy()))?;
     Ok(())
 }
 
@@ -48,7 +64,8 @@ pub fn metafile_to_string(file: &MetaFile, dirs: &Options, name: Option<&str>) -
                         .filter(|val| *val != "BLANK" && *val != "DEFAULT")
                         .map(|val| val.to_string())
                         .unwrap_or_default(),
-                    Substitution::Pattern(key) => get_pattern(key, file, dirs)?,
+                    Substitution::Pattern(key) => get_pattern(key, file, dirs)
+                        .wrap_err_with(|| eyre!("could not find pattern for: {}\n", key))?,
                     // comments have already been removed at this point,
                     // so we use them to mark keys for array substitution
                     Substitution::Array(key) => {
@@ -69,7 +86,7 @@ pub fn metafile_to_string(file: &MetaFile, dirs: &Options, name: Option<&str>) -
 }
 
 fn get_source_html(file: &MetaFile, dirs: &Options) -> Result<String> {
-    let file = metafile_to_string(file, dirs, Some("SOURCE"))?;
+    let file = metafile_to_string(file, dirs, Some("SOURCE")).wrap_err("failed building source")?;
     let mut pandoc = Pandoc::new();
 
     pandoc
@@ -104,7 +121,9 @@ fn get_pattern(key: &str, file: &MetaFile, dirs: &Options) -> Result<String> {
         let mut path = dirs.pattern.join(pattern_path);
         path.set_extension("meta");
 
-        return Ok(fs::read_to_string(path.to_str().unwrap_or_default())?);
+        let base = fs::read_to_string(&path)
+            .wrap_err_with(|| eyre!("could not read: {}\n", path.to_string_lossy()))?;
+        return Ok(base);
     }
 
     // BLANK returns nothing, so no more processing needs to be done
@@ -120,8 +139,10 @@ fn get_pattern(key: &str, file: &MetaFile, dirs: &Options) -> Result<String> {
     let mut path = dirs.pattern.join(pattern_path);
     path.set_extension("meta");
 
-    let pattern = &fs::read_to_string(path.to_str().unwrap_or_default())?;
-    let mut pattern = parse_file(pattern)?;
+    let pattern = &fs::read_to_string(&path)
+        .wrap_err_with(|| eyre!("could not read: {}\n", path.to_string_lossy()))?;
+    let mut pattern = parse_file(pattern)
+        .wrap_err_with(|| eyre!("could not parse: {}\n", path.to_string_lossy()))?;
 
     // copy over maps for expanding contained variables
     pattern.variables = file.variables.clone();
@@ -132,11 +153,14 @@ fn get_pattern(key: &str, file: &MetaFile, dirs: &Options) -> Result<String> {
 }
 
 fn find_dest(path: &Path, dirs: &Options) -> Result<PathBuf> {
-    let source = dirs.source.to_string_lossy().to_string();
-    let build = dirs.build.to_string_lossy().to_string();
-
-    let path = path.canonicalize()?.to_string_lossy().to_string();
-    let path = path.replace(&source, &build);
+    let source = dirs.source.to_string_lossy();
+    let build = dirs.build.to_string_lossy();
+
+    let path = path
+        .canonicalize()
+        .wrap_err_with(|| eyre!("could not get absolute path: {}\n", path.to_string_lossy()))?;
+    let path = path.to_string_lossy();
+    let path = path.replace(&*source, &*build);
     let mut path = PathBuf::from(path);
 
     path.set_extension("html");
index ce82dbed3f9dfd21d5d57a88ac330177b6fb2b24..2146e6253ceb46af5fdbd5e5de8231584c42e1e3 100644 (file)
@@ -1,8 +1,34 @@
-use color_eyre::Result;
-use metaforge::parse_opts;
+use color_eyre::{eyre::bail, Result};
+use metaforge::{build_metafile, parse_opts};
+use std::path::PathBuf;
+use walkdir::WalkDir;
 
 fn main() -> Result<()> {
+    color_eyre::install()?;
+
     let opts = parse_opts()?;
-    println!("{:?}", opts);
+
+    let files: Vec<PathBuf> = WalkDir::new(&opts.source)
+        .into_iter()
+        .filter_map(|file| file.ok())
+        .filter(|file| file.file_type().is_file())
+        .map(|file| file.into_path())
+        .collect();
+
+    for file in files.iter() {
+        match build_metafile(file, &opts) {
+            Ok(_) => continue,
+            Err(e) => {
+                if opts.force {
+                    // print a line to stderr about failure but continue with other files
+                    eprintln!("error in {}: {}", file.to_string_lossy(), e);
+                    continue;
+                } else {
+                    bail!("error in {}: {}", file.to_string_lossy(), e);
+                }
+            }
+        }
+    }
+
     Ok(())
 }
index 8c1cbff8eeb568e61d5310390c3ba42ad523b3bc..f2f7c228205be7e8ceae7699d2d1da348e2cadd2 100644 (file)
@@ -2,7 +2,7 @@ use crate::{parse_file, source, Source, Substitution};
 use color_eyre::Result;
 use pretty_assertions::assert_eq;
 
-static SOURCE: &str = include_str!("../../test_site/source/test_source.meta");
+static SOURCE: &str = include_str!("../../tests/files/test_source.meta");
 static PATTERN: &str = include_str!("../../test_site/pattern/test/pattern.meta");
 
 #[test]
diff --git a/test_site/source/sub_dir/sub_source.meta b/test_site/source/sub_dir/sub_source.meta
deleted file mode 100644 (file)
index 2ddc53b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-${
-    overwrite = 'GOOD'
-    new = 'GOOD'
-    blank = BLANK
-}
-
-@{
-    overwrite = ['GOOD']
-    new = ['GOOD']
-}
-
-&{
-    test.overwrite = 'overwrite'
-    test.new = 'new'
-    test.blank = BLANK
-    test.default = DEFAULT
-}
-
-This is a test for a file in a sub_directory to test
-overwriting variables and patterns.
-
-var [OVERWRITE]: ${overwrite}
-var [PARENT]: ${parent}
-var [NEW]: ${new}
-var [BLANK]: ${blank}
-
-arr [OVERWRITE]: @{overwrite}
-arr [NEW]: @{new}
-
-pat [OVERWRITE]: &{test.overwrite}
-pat [NEW]: &{test.new}
-pat [BLANK]: &{test.blank}
-pat [DEFAULT]: &{test.default}