seam

Symbolic-Expressions As Markup.
git clone git://git.knutsen.co/seam
Log | Files | Refs | README | LICENSE

commit 81fe6acf8f40bfabc68aaea46cfd57895bcc46f1
parent 176485af79ac8b9c3eada7f4460e7f64035d4040
Author: Demonstrandum <samuel@knutsen.co>
Date:   Mon,  2 Dec 2024 00:32:07 +0000

removed debug prints.

Diffstat:
Mcrates/seam/src/parse/macros.rs | 34++++++++++++++++++++--------------
Mcrates/seam/src/parse/mod.rs | 2+-
2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/crates/seam/src/parse/macros.rs b/crates/seam/src/parse/macros.rs @@ -1,5 +1,6 @@ //! Expander macros argument parsing utilities. -use std::{borrow::Borrow, collections::HashMap, iter::zip}; +use std::{collections::HashMap, iter::zip}; +use std::fmt::Write as _; use regex::Regex; @@ -17,7 +18,15 @@ pub enum ArgPredicate { impl ArgPredicate { pub fn check_node<'tree>(&self, node: &Node<'tree>) -> Result<(), ExpansionError<'tree>> { - Ok(()) + match self { + Self::Exactly(value) => if node.value == *value { Ok(()) } else { + Err(ExpansionError( + format!("value must be equal to `{}`.", value), + node.site.to_owned(), + )) + } + _ => Ok(()) + } } pub fn check<'tree>(&self, node: &ParseNode<'tree>) -> Result<(), ExpansionError<'tree>> { Ok(()) @@ -54,9 +63,13 @@ fn check_all_node<'tree>(preds: &Vec<ArgPredicate>, node: &Node<'tree>) -> Resul } if issues.is_empty() { return Ok(()); } // Amalgamate errors. - let mut error = String::from("This argument's value did not satisfy one of the follwining:\n"); - for issue in issues { - error += &format!(" * {}", issue.0); + let mut error = String::new(); + let _ = writeln!(error, "This argument's value did not satisfy one of the follwining:"); + for (i, issue) in issues.iter().enumerate() { + let _ = write!(error, " * {}", issue.0); + if i != issues.len() - 1 { + let _ = write!(error, "\n"); + } } Err(ExpansionError(error, node.site.clone())) } @@ -154,7 +167,7 @@ impl Arg { /// Positonal or named argument position. #[derive(Debug, Clone)] -enum ArgPos<'a> { Int(usize), Str(&'a str) } +pub enum ArgPos<'a> { Int(usize), Str(&'a str) } /// What kind of types can be matched against /// when determining an arguments positionality. pub trait ArgMatcher { @@ -261,7 +274,6 @@ impl<'params, 'rules, 'tree> ArgParser<'params, 'rules, 'tree> { let mut named = HashMap::with_capacity(params.len()); let mut trailing = vec![]; let mut mandatory_count: usize = 0; - println!("going through params: {:?}", params); for param in params { let matcher: Box<dyn ArgMatcher + 'rules>; @@ -278,10 +290,8 @@ impl<'params, 'rules, 'tree> ArgParser<'params, 'rules, 'tree> { // Check if they do actually match with any of the rules. let mut arg_rule = None; for rule in &rules.patterns { - println!("calling matcher"); // First check that there is a valid place for this argument. let is_valid_argument = (rule.pattern)(&matcher); - println!("checked pattern {:?} against {:?} and got {:?}", rule.pattern, matcher.unwrap(), is_valid_argument); if is_valid_argument { arg_rule = Some(rule); break; @@ -291,7 +301,6 @@ impl<'params, 'rules, 'tree> ArgParser<'params, 'rules, 'tree> { // check if it can be given as trailing argument. match arg_rule { Some(rule) => { - println!("matched param against rule: {:?}", rule); // Now check that the types are satisfied. let argtype = rule.argument.argtype(); argtype.check(param_node)?; @@ -302,10 +311,7 @@ impl<'params, 'rules, 'tree> ArgParser<'params, 'rules, 'tree> { }; // Register if a mandatory argument was consumed. match rule.argument { - Arg::Mandatory(..) => { - println!("found mand"); - mandatory_count += 1 - }, + Arg::Mandatory(..) => mandatory_count += 1, _ => {}, }; }, diff --git a/crates/seam/src/parse/mod.rs b/crates/seam/src/parse/mod.rs @@ -2,7 +2,7 @@ pub mod tokens; pub mod lexer; pub mod parser; #[macro_use] -mod macros; +pub mod macros; pub mod expander; pub use parser::ParseTree;