]> git.huck.website - metaforge.git/commitdiff
cleanup
authorHuck Boles <huck@huck.website>
Sun, 14 May 2023 20:17:30 +0000 (15:17 -0500)
committerHuck Boles <huck@huck.website>
Sun, 14 May 2023 20:17:30 +0000 (15:17 -0500)
src/builder.rs
src/lib.rs
src/metafile.rs
src/parser.rs

index 08deae6e74593e52bce0e5e62af0f4a6f1354fb5..ff8e7027de60eaddaf2e507f8c842fd8082c9556 100644 (file)
@@ -120,7 +120,7 @@ fn get_pattern(key: &str, file: &MetaFile) -> Result<String> {
 
     // BLANK returns nothing, so no more processing needs to be done
     if filename == "BLANK" {
-        return Ok(String::new());
+        return Ok(String::from(""));
     };
 
     // DEFAULT override for patterns defined higher in chain
@@ -140,8 +140,17 @@ fn get_pattern(key: &str, file: &MetaFile) -> Result<String> {
     metafile_to_string(&pattern)
 }
 
-fn get_variable(_key: &str, _file: &MetaFile) -> Result<String> {
-    todo!()
+fn get_variable(key: &str, file: &MetaFile) -> Result<String> {
+    let long_key = file.name()? + "." + key;
+    if let Some(val) = file.get_var(&long_key) {
+        Ok(val.clone())
+    } else if let Some(val) = file.get_var(key) {
+        Ok(val.clone())
+    } else if file.opts.undefined {
+        bail!("undefined variable: {}, {}", key, long_key)
+    } else {
+        Ok(String::new())
+    }
 }
 
 fn find_dest(path: &Path, opts: &Options) -> Result<PathBuf> {
index 9a9a080674cd7db6028ad8724857de3a78836d6f..7f342f3725204bc7dea0c8c22e5f242cd547c9ee 100644 (file)
@@ -18,16 +18,11 @@ use color_eyre::Result;
 pub fn get_opts() -> Result<Options> {
     let opts = Options::try_from(Opts::parse())?;
 
-    log!(
-        opts,
-        format!("cleaning build directory: {}", opts.build.display()),
-        1
-    );
-    if opts.clean && opts.build.exists() {
+    let exists = opts.build.exists();
+    if exists && opts.clean {
         std::fs::remove_dir_all(&opts.build)?;
-    }
-
-    if !opts.build.exists() {
+        std::fs::create_dir(&opts.build)?;
+    } else if !exists {
         std::fs::create_dir(&opts.build)?;
     }
 
@@ -37,7 +32,7 @@ pub fn get_opts() -> Result<Options> {
 pub fn build_dir(opts: &Options) -> Result<()> {
     let mut source = DirNode::build(opts.source.clone(), opts)?;
 
-    let global_init = MetaFile::new(&opts);
+    let global_init = MetaFile::new(opts);
 
     source.map(&global_init)?;
 
index 01ef06f00ca75db0defafc830619938a5ca56a0b..a090dc3ecd61501c53223d68726f40e146b0fa8e 100644 (file)
@@ -19,7 +19,6 @@ impl<'a> MetaFile<'a> {
         let str = fs::read_to_string(&path)?;
         let mut metafile = parse_file(str, opts)?;
         metafile.path = path;
-        metafile.opts = opts;
         Ok(metafile)
     }
 
@@ -121,7 +120,10 @@ impl<'a> DirNode<'a> {
     pub fn build(path: PathBuf, opts: &'a Options) -> Result<Self> {
         assert!(path.is_dir() && path.exists());
 
-        fs::create_dir(opts.build.join(path.strip_prefix(&opts.source)?))?;
+        let build_dir = opts.build.join(path.strip_prefix(&opts.source)?);
+        if !build_dir.exists() {
+            fs::create_dir(build_dir)?;
+        }
 
         let files: Vec<MetaFile> = Vec::new();
         let dirs: Vec<DirNode> = Vec::new();
index 65e11d3e2c97f2b740ef058577f084ba825b22b2..817302ba919e8522ab34b71f1d65f51b9891a904 100644 (file)
@@ -72,7 +72,7 @@ fn parse_source(pairs: Pairs<Rule>) -> Vec<Src> {
             Rule::var_sub => vec.push(source!(var(parse_sub(pair)))),
             Rule::arr_sub => vec.push(source!(arr(parse_sub(pair)))),
             Rule::pat_sub => vec.push(source!(pat(parse_sub(pair)))),
-            Rule::char_seq => vec.push(source!(pair)),
+            Rule::char_seq => vec.push(source!(pair.as_str())),
             // anything that isn't a substitution is a char_seq inside source
             _ => unreachable!(),
         }