]> git.huck.website - metaforge.git/commitdiff
refactor: clippy suggestions
authorHuck Boles <huck@huck.website>
Sat, 20 May 2023 18:31:23 +0000 (13:31 -0500)
committerHuck Boles <huck@huck.website>
Sat, 20 May 2023 18:31:23 +0000 (13:31 -0500)
12 files changed:
src/builder.rs
src/builder/array.rs
src/builder/source.rs
src/builder/tests.rs
src/builder/variable.rs
src/error.rs
src/lib.rs
src/main.rs
src/metafile.rs
src/metafile/dir.rs
src/metafile/file.rs
src/metafile/scope.rs

index 0ead5ea12f483e83fd1a62738aab20919ddf5128..c225e49684f57c7cace373e98cc7c2f412e35cfb 100644 (file)
@@ -13,22 +13,22 @@ mod tests;
 use crate::{MetaError, MetaFile, Scope};
 use eyre::Result;
 
-pub fn build_metafile(file: &MetaFile) -> Result<String, MetaError> {
+pub fn build_metafile(file: &MetaFile) -> Result<String, Box<MetaError>> {
     if file.header.blank {
         return Ok(String::new());
     } else if file.header.ignore {
-        return Err(MetaError::Ignored);
+        return Err(Box::new(MetaError::Ignored));
     }
 
-    let html = get_source_html(file)?;
+    let html = get_source_html(file).map_err(MetaError::from)?;
 
-    let pattern = get_pattern("base", file)?;
-    let mut base = crate::parse_string(pattern, file.opts)?;
+    let pattern = get_pattern("base", file).map_err(MetaError::from)?;
+    let mut base = crate::parse_string(pattern, file.opts).map_err(MetaError::from)?;
 
     base.merge(file);
     base.patterns.insert(Scope::into_global("SOURCE"), html);
 
-    let output = metafile_to_string(&base)?;
+    let output = metafile_to_string(&base).map_err(MetaError::from)?;
 
     Ok(output)
 }
index 52edfa393aa4e8b090aa1088cc61b734e9bae68c..763dbd4f4feee9c082fbb9e5de62f7cba2aa9e16 100644 (file)
@@ -1,4 +1,4 @@
-use crate::{MetaFile, Scope, Src};
+use crate::{MetaError, MetaFile, Scope, Src};
 use eyre::Result;
 use std::collections::HashMap;
 
@@ -20,16 +20,22 @@ pub fn expand_arrays(input: String, file: &MetaFile) -> Result<String> {
             let name = file.name().unwrap_or_default();
             let long_key = name + "." + key;
 
-            let value = if let Some(val) = file.get_arr(&Scope::into_global(long_key.to_string())) {
+            let value = if let Some(val) = file.get_arr(&Scope::into_global(&long_key)) {
                 val
-            } else if let Some(val) = file.get_arr(&Scope::into_local(long_key.to_string())) {
+            } else if let Some(val) = file.get_arr(&Scope::into_local(&long_key)) {
                 val
             } else if let Some(val) = file.get_arr(&Scope::into_global(key)) {
                 val
             } else if let Some(val) = file.get_arr(&Scope::into_local(key)) {
                 val
             } else if file.opts.undefined {
-                panic!("undefined array called: {}, {}", key, long_key);
+                panic!(
+                    "{}",
+                    MetaError::UndefinedExpand {
+                        val: key.to_string(),
+                        path: file.path.to_string_lossy().to_string(),
+                    }
+                )
             } else {
                 &[]
             };
@@ -39,7 +45,16 @@ pub fn expand_arrays(input: String, file: &MetaFile) -> Result<String> {
 
     // loop to duplicate the output template for each array member
     let mut expanded = String::new();
-    for i in 0..get_max_size(&map) {
+    let size = match get_array_size(&map, file.header.equal_arrays) {
+        Ok(num) => Ok(num),
+        Err(e) => match e.as_ref() {
+            &MetaError::Array => Err(MetaError::UnequalArrays {
+                path: file.path.to_string_lossy().to_string(),
+            }),
+            _ => Err(MetaError::Unknown),
+        },
+    }?;
+    for i in 0..size {
         // get a fresh copy of the file
         let mut str = input.clone();
         // replace each key in the file
@@ -55,12 +70,27 @@ pub fn expand_arrays(input: String, file: &MetaFile) -> Result<String> {
     Ok(expanded)
 }
 
-fn get_max_size(map: &HashMap<String, &[String]>) -> usize {
+fn get_array_size(
+    map: &HashMap<String, &[String]>,
+    same_size: bool,
+) -> Result<usize, Box<MetaError>> {
+    if same_size {
+        let mut size = (0, false);
+        for val in map.values() {
+            if !size.1 {
+                size = (val.len(), true);
+            } else if size.0 != val.len() {
+                return Err(Box::new(MetaError::Array));
+            }
+        }
+        return Ok(size.0);
+    }
+
     let mut max = 0;
     for val in map.values() {
         if max < val.len() {
             max = val.len();
         }
     }
-    max
+    Ok(max)
 }
index f16b5009fd8509c912e526d46c85709c156f5bff..0ae65441c35a0b72c57e6a982002a9cff11d0b4a 100644 (file)
@@ -1,5 +1,6 @@
 use crate::{MetaError, MetaFile, Src};
 use eyre::Result;
+use pandoc::{InputFormat, InputKind, OutputFormat, OutputKind, Pandoc};
 
 use super::array::*;
 use super::*;
@@ -7,13 +8,13 @@ use super::*;
 pub fn get_source_html(file: &MetaFile) -> Result<String> {
     let string = metafile_to_string(file)?;
 
-    if file.opts.no_pandoc || !file.header.pandoc || string == "" {
+    if file.opts.no_pandoc || !file.header.pandoc || string.is_empty() {
         return Ok(string);
     }
 
-    let input: pandoc::InputFormat;
-    let output: pandoc::OutputFormat;
-    if let Ok(io) = get_pandoc_io(&file) {
+    let input: InputFormat;
+    let output: OutputFormat;
+    if let Ok(io) = get_pandoc_io(file) {
         input = io.0;
         output = io.1;
     } else {
@@ -21,10 +22,10 @@ pub fn get_source_html(file: &MetaFile) -> Result<String> {
         return Ok(string);
     }
 
-    let mut pandoc = pandoc::Pandoc::new();
+    let mut pandoc = Pandoc::new();
     pandoc
-        .set_input(pandoc::InputKind::Pipe(string))
-        .set_output(pandoc::OutputKind::Pipe)
+        .set_input(InputKind::Pipe(string))
+        .set_output(OutputKind::Pipe)
         .set_input_format(input, vec![])
         .set_output_format(output, vec![]);
 
@@ -70,10 +71,7 @@ pub fn metafile_to_string(file: &MetaFile) -> Result<String> {
 
 fn get_pandoc_io(
     file: &MetaFile,
-) -> Result<(pandoc::InputFormat, pandoc::OutputFormat), MetaError> {
-    let input: pandoc::InputFormat;
-    let output: pandoc::OutputFormat;
-
+) -> Result<(pandoc::InputFormat, pandoc::OutputFormat), Box<MetaError>> {
     let mut source_type = "";
     if !file.header.source.is_empty() {
         source_type = &file.header.source;
@@ -81,14 +79,14 @@ fn get_pandoc_io(
         source_type = &file.opts.input;
     }
 
-    match source_type {
-        "markdown" => input = pandoc::InputFormat::Markdown,
-        "html" => input = pandoc::InputFormat::Html,
-        "org" => input = pandoc::InputFormat::Org,
-        "json" => input = pandoc::InputFormat::Json,
-        "latex" => input = pandoc::InputFormat::Latex,
-        _ => return Err(MetaError::Filetype.into()),
-    }
+    let input = match source_type {
+        "markdown" => Ok(InputFormat::Markdown),
+        "html" => Ok(InputFormat::Html),
+        "org" => Ok(InputFormat::Org),
+        "json" => Ok(InputFormat::Json),
+        "latex" => Ok(InputFormat::Latex),
+        _ => Err(Box::new(MetaError::Filetype)),
+    }?;
 
     let mut filetype = "";
     if !file.header.filetype.is_empty() {
@@ -97,18 +95,18 @@ fn get_pandoc_io(
         filetype = &file.opts.output;
     }
 
-    match filetype {
-        "html" => output = pandoc::OutputFormat::Html,
-        "markdown" => output = pandoc::OutputFormat::Markdown,
-        "man" => output = pandoc::OutputFormat::Man,
-        "txt" => output = pandoc::OutputFormat::Plain,
-        "org" => output = pandoc::OutputFormat::Org,
-        "json" => output = pandoc::OutputFormat::Json,
-        "latex" => output = pandoc::OutputFormat::Latex,
-        "asciidoc" => output = pandoc::OutputFormat::Asciidoc,
-        "pdf" => output = pandoc::OutputFormat::Pdf,
-        _ => return Err(MetaError::Filetype.into()),
-    };
+    let output = match filetype {
+        "html" => Ok(OutputFormat::Html),
+        "markdown" => Ok(OutputFormat::Markdown),
+        "man" => Ok(OutputFormat::Man),
+        "txt" => Ok(OutputFormat::Plain),
+        "org" => Ok(OutputFormat::Org),
+        "json" => Ok(OutputFormat::Json),
+        "latex" => Ok(OutputFormat::Latex),
+        "asciidoc" => Ok(OutputFormat::Asciidoc),
+        "pdf" => Ok(OutputFormat::Pdf),
+        _ => Err(Box::new(MetaError::Filetype)),
+    }?;
 
     Ok((input, output))
 }
index 67087425f743efb28b161aa7cb449c5dd9086e88..4ac2c09f30a453840e7ba243eafb5fb7711437c0 100644 (file)
@@ -47,29 +47,30 @@ fn clean_build_dir() -> Result<()> {
 fn builder_tests() -> Result<()> {
     clean_build_dir()?;
 
-    let mut tests: Vec<(&str, &str)> = Vec::new();
-    tests.push(("find_dest", "<html>\n</html>\n"));
-    tests.push(("blank/blank_pattern", ""));
-    tests.push(("blank/blank_variable", "<html>\n</html>\n"));
-    tests.push(("blank/blank_array", "<html>\n</html>\n"));
-    tests.push(("blank/comment", "<html>\n</html>\n"));
-    tests.push((
-        "blank/inline_comment",
-        "<html>\n<p>inline comment</p>\n</html>\n",
-    ));
-    tests.push((
-        "expand/variable_in_source",
-        "<html>\n<p>GOOD</p>\n</html>\n",
-    ));
-    tests.push(("expand/variable_in_pattern", "<html>\nGOOD</html>\n"));
-    tests.push(("expand/array_in_source", "<html>\n<p>12345</p>\n</html>\n"));
-    tests.push(("expand/array_in_pattern", "<html>\n12345</html>\n"));
-    tests.push(("expand/pattern_in_source", "<p>GOOD</p>\n"));
-    tests.push(("expand/pattern_in_pattern", "<html>\nGOOD\nGOOD\n</html>\n"));
-    tests.push(("override/variable", "<html>\n<p>GOOD</p>\n</html>\n"));
-    tests.push(("override/pattern", "<html>\nGOOD\nGOOD\n</html>\n"));
-    tests.push(("header/pandoc", "# This should not become html\n"));
-    tests.push(("header/blank", ""));
+    let tests: Vec<(&str, &str)> = vec![
+        ("find_dest", "<html>\n</html>\n"),
+        ("blank/blank_pattern", ""),
+        ("blank/blank_variable", "<html>\n</html>\n"),
+        ("blank/blank_array", "<html>\n</html>\n"),
+        ("blank/comment", "<html>\n</html>\n"),
+        (
+            "blank/inline_comment",
+            "<html>\n<p>inline comment</p>\n</html>\n",
+        ),
+        (
+            "expand/variable_in_source",
+            "<html>\n<p>GOOD</p>\n</html>\n",
+        ),
+        ("expand/variable_in_pattern", "<html>\nGOOD</html>\n"),
+        ("expand/array_in_source", "<html>\n<p>12345</p>\n</html>\n"),
+        ("expand/array_in_pattern", "<html>\n12345</html>\n"),
+        ("expand/pattern_in_source", "<p>GOOD</p>\n"),
+        ("expand/pattern_in_pattern", "<html>\nGOOD\nGOOD\n</html>\n"),
+        ("override/variable", "<html>\n<p>GOOD</p>\n</html>\n"),
+        ("override/pattern", "<html>\nGOOD\nGOOD\n</html>\n"),
+        ("header/pandoc", "# This should not become html\n"),
+        ("header/blank", ""),
+    ];
 
     let mut err = false;
     let mut errs: Vec<Box<dyn Error>> = Vec::new();
@@ -85,7 +86,7 @@ fn builder_tests() -> Result<()> {
 
     if err {
         for e in errs.iter() {
-            eprintln!("{}", e.to_string());
+            eprintln!("{}", e);
         }
         return Err(eyre::eyre!("failed tests"));
     }
index 8560836ce42c1df19321a829fd688c9b592add88..8753eacc65a2ce247e01cd5af69d3dffdeca62ec 100644 (file)
@@ -3,9 +3,9 @@ use eyre::Result;
 
 pub fn get_variable(key: &str, file: &MetaFile) -> Result<String> {
     let long_key = file.name()? + "." + key;
-    if let Some(val) = file.get_var(&Scope::into_local(long_key.to_string())) {
+    if let Some(val) = file.get_var(&Scope::into_local(&long_key)) {
         Ok(val.clone())
-    } else if let Some(val) = file.get_var(&Scope::into_global(long_key.to_string())) {
+    } else if let Some(val) = file.get_var(&Scope::into_global(&long_key)) {
         Ok(val.clone())
     } else if let Some(val) = file.get_var(&Scope::into_local(key)) {
         Ok(val.clone())
index 0bbbf1d48e43aea0cc26b5f87858aded5116f0b2..8bd0893716905d4ce17e78d33655dca4a92574fb 100644 (file)
@@ -3,12 +3,16 @@ use thiserror::Error;
 
 #[derive(Error, Debug)]
 pub enum MetaError {
-    #[error("unknown error")]
+    #[error("unknown internal error")]
     Unknown,
-    #[error("ignored")]
+    #[error("internal break switch")]
     Ignored,
-    #[error("filetype")]
+    #[error("internal filetype error")]
     Filetype,
+    #[error("internal array error")]
+    Array,
+    #[error("mismatched array sizes in {path}")]
+    UnequalArrays { path: String },
     #[error("could not find {path}")]
     FileNotFound { path: String },
     #[error("could not determine name from {file}")]
index a99ab4cd51b35b87876217d529ed9947e7932766..1296074cb79e40cc1b8a512a8dfdaebea66143f9 100644 (file)
@@ -44,7 +44,7 @@ pub fn build_site(opts: &Options) -> Result<()> {
 
 pub fn single_file(opts: &Options) -> Result<String> {
     let path = opts.file.as_ref().ok_or(MetaError::Unknown)?;
-    let source = match fs::read_to_string(&path) {
+    let source = match fs::read_to_string(path) {
         Ok(str) => Ok(str),
         Err(_) => Err(eyre::Error::from(MetaError::FileNotFound {
             path: path.to_string_lossy().to_string(),
index d51cac30f49814193ba63910d20816436125a484..eb86cc07068d9e21ea9753d4ad19a8c173a55fcb 100644 (file)
@@ -5,11 +5,11 @@ fn main() -> eyre::Result<()> {
         return metaforge::new_site(&opts);
     }
 
-    if let Some(_) = &opts.file {
+    if opts.file.is_some() {
         let str = metaforge::single_file(&opts)?;
         println!("{str}");
         Ok(())
     } else {
-        return metaforge::build_site(&opts);
+        metaforge::build_site(&opts)
     }
 }
index 5efa2cc2a8ee8ba1b2a65c71e61bea69605e44d2..c23fa8b871854957f97057c9a4074df399d5ea6a 100644 (file)
@@ -35,8 +35,10 @@ impl Src {
     pub fn to_str(str: impl ToString) -> Self {
         Src::Str(str.to_string())
     }
+}
 
-    pub fn to_string(&self) -> String {
+impl ToString for Src {
+    fn to_string(&self) -> String {
         match self {
             Src::Var(x) | Src::Arr(x) | Src::Pat(x) | Src::Str(x) => x.to_string(),
         }
index 940d3f4a0378e8c1ade7527ca3ea84a80cc1dbb5..e8ab48fc04f0ff5988e10aff54cabe29628f4f55 100644 (file)
@@ -72,7 +72,7 @@ impl<'a> DirNode<'a> {
                         continue;
                     } else {
                         // we raise an ignored error to quickly abort any file parsing
-                        if let MetaError::Ignored = e {
+                        if let MetaError::Ignored = *e {
                             continue;
                         // anything else gets wrapped up and passed up the calling chain
                         } else {
index cf16ed4027e8bd8fe6956335094c6b30117ef98c..d7b7162a25ca6e296d6fabf023fb2099b94758a7 100644 (file)
@@ -102,33 +102,18 @@ impl<'a> MetaFile<'a> {
     }
 
     pub fn var_defined(&self, key: &str) -> bool {
-        if self.variables.contains_key(&Scope::into_local(key))
+        self.variables.contains_key(&Scope::into_local(key))
             || self.variables.contains_key(&Scope::into_global(key))
-        {
-            true
-        } else {
-            false
-        }
     }
 
     pub fn arr_defined(&self, key: &str) -> bool {
-        if self.arrays.contains_key(&Scope::into_local(key))
+        self.arrays.contains_key(&Scope::into_local(key))
             || self.arrays.contains_key(&Scope::into_global(key))
-        {
-            true
-        } else {
-            false
-        }
     }
 
     pub fn pat_defined(&self, key: &str) -> bool {
-        if self.patterns.contains_key(&Scope::into_local(key))
+        self.patterns.contains_key(&Scope::into_local(key))
             || self.patterns.contains_key(&Scope::into_global(key))
-        {
-            true
-        } else {
-            false
-        }
     }
 
     pub fn merge(&mut self, other: &Self) {
index 3af714b28443dcbd9da503537562074034f17b78..8e23b1db7f6a232e0bf00636fab8968c4c11a722 100644 (file)
@@ -13,12 +13,6 @@ impl Scope {
         Scope::Global(str.to_string())
     }
 
-    pub fn to_string(&self) -> String {
-        match self {
-            Scope::Local(x) | Scope::Global(x) => x.to_string(),
-        }
-    }
-
     pub fn is_global(&self) -> bool {
         match self {
             Scope::Local(_) => false,
@@ -41,3 +35,11 @@ impl Scope {
         Scope::Global(self.to_string())
     }
 }
+
+impl ToString for Scope {
+    fn to_string(&self) -> String {
+        match self {
+            Scope::Local(x) | Scope::Global(x) => x.to_string(),
+        }
+    }
+}