diff --git a/gemla/src/main.rs b/gemla/src/main.rs index 39efa8d..75b8a00 100644 --- a/gemla/src/main.rs +++ b/gemla/src/main.rs @@ -2,8 +2,9 @@ extern crate clap; extern crate regex; -mod bracket; +#[macro_use] mod tree; +mod bracket; mod constants; mod file_linked; diff --git a/gemla/src/tests/tree.rs b/gemla/src/tests/tree.rs index f9b3959..4b3eec4 100644 --- a/gemla/src/tests/tree.rs +++ b/gemla/src/tests/tree.rs @@ -20,9 +20,9 @@ fn test_new() { fn test_fmt() { assert_eq!( format!( - "{}", - Tree::new("foo", Some(Box::new(Tree::new("bar", None, None))), None) - ), + "{}", + btree!("foo", btree!("bar"),), + ), "(foo: (bar: _|_)|_)" ); } @@ -30,17 +30,11 @@ fn test_fmt() { #[test] fn test_fmt_node() { assert_eq!( - Tree::fmt_node(&Some(Box::new(Tree::new( - 17, - Some(Box::new(Tree::new(16, None, None))), - Some(Box::new(Tree::new(12, None, None))), - )))), + Tree::fmt_node(&Some(Box::new(btree!(17, btree!(16), btree!(12))))), "17" ); assert_eq!( - Tree::fmt_node(&Some(Box::new( - Tree::new(Tree::new("foo", None, None), None, None), - ))), + Tree::fmt_node(&Some(Box::new(btree!(btree!("foo"))))), "(foo: _|_)" ); assert_eq!(Tree::::fmt_node(&None), "_"); diff --git a/gemla/src/tree/mod.rs b/gemla/src/tree/mod.rs index 914aaf3..65a43ed 100644 --- a/gemla/src/tree/mod.rs +++ b/gemla/src/tree/mod.rs @@ -9,6 +9,16 @@ pub struct Tree { pub right: Option>>, } +#[macro_export] +macro_rules! btree { + ($val:expr, $l:expr, $r:expr) => { + $crate::tree::Tree::new($val, Some(Box::new($l)), Some(Box::new($r))) + }; + ($val:expr, , $r:expr) => { $crate::tree::Tree::new($val, None, Some(Box::new($r))) }; + ($val:expr, $l:expr,) => { $crate::tree::Tree::new($val, Some(Box::new($l)), None) }; + ($val:expr) => { Tree::new($val, None, None) }; +} + impl Tree { pub fn new(val: T, left: Option>>, right: Option>>) -> Tree { Tree { val, left, right } @@ -109,76 +119,11 @@ where type Err = ParseTreeError; fn from_str(s: &str) -> Result { - let mut result = Err(ParseTreeError::new(String::from( - "Unable to parse tree, string format unreognized.", - ))); - let re = Regex::new(r"\(([0-9a-fA-F-]+)\s*:\s*(.*)\)$").unwrap(); - let caps = re.captures(s); - - if let Some(c) = caps { - let val = T::from_str(c.get(1).unwrap().as_str()).or(Err( - ParseTreeError::new( - format!( - "Unable to parse node value: {}", - c.get(1) - .unwrap() - .as_str() - ), - ), - ))?; - let (left, right) = seperate_nodes(c.get(2).unwrap().as_str())?; - let left = from_str_helper(left)?; - let right = from_str_helper(right)?; - - result = Ok(Tree::new(val, left, right)); - } - - // if let Some(c) = caps { - // result = T::from_str(c.get(1).unwrap().as_str()) - // .or(Err(ParseTreeError::new( - // format!("Unable to parse node value: {}", c.get(1).unwrap().as_str())))) - // .and_then(|v| { - // seperate_nodes(c.get(2).unwrap().as_str()) - // .and_then(|(left, right)| { - // from_str_helper(left) - // .and_then(|l| { - // from_str_helper(right) - // .and_then(|r| { - // Ok(Tree::new(v, l, r)) - // }) - // }) - // }) - // }) - // } - - // if let Some(c) = caps { - // let val = T::from_str(c.get(1).unwrap().as_str()); - // if let Ok(v) = val { - // match seperate_nodes(c.get(2).unwrap().as_str()) { - // Ok((l, r)) => { - // match (from_str_helper(l), from_str_helper(r)) { - // (Ok(left), Ok(right)) => { - // result = Ok(Tree::new(v, left, right)); - // }, - // (Err(e), _) => { - // result = Err(e); - // }, - // (_, Err(e)) => { - // result = Err(e); - // } - // } - // }, - // Err(e) => { - // result = Err(e); - // } - // } - // } else { - // result = Err(ParseTreeError::new( - // format!("Unable to parse node value: {}", c.get(1).unwrap().as_str()))); - // } - // } + let result = from_str_helper(s)?; result + .ok_or(ParseTreeError::new(format!("Unable to parse string {}", s))) + .and_then(|t| Ok(*t)) } }