summaryrefslogtreecommitdiff
path: root/src/def_rules.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/def_rules.rs')
-rw-r--r--src/def_rules.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/def_rules.rs b/src/def_rules.rs
new file mode 100644
index 0000000..a2ba36e
--- /dev/null
+++ b/src/def_rules.rs
@@ -0,0 +1,24 @@
+use crate::sexpr::{self, Atom, Expr};
+
+#[derive(Debug, Clone)]
+pub struct Rule {
+ pub lhs: Expr,
+ pub rhs: Expr
+}
+
+impl TryFrom<Expr> for Rule {
+ type Error = ();
+ fn try_from(value: Expr) -> Result<Self, Self::Error> {
+ if let Expr::Application(v) = value && v[0] == Expr::Atom(Atom::Builtin(String::from("def-rule"))) && v.len() == 3 {
+ Ok(Rule {
+ lhs: v[1].clone(),
+ rhs: v[2].clone()
+ })
+ } else {Err(())}
+ }
+}
+
+pub fn parse_def_rules(input: String) -> Vec<Rule> {
+ let exprs = sexpr::Parser::new(&input).parse_all();
+ exprs.iter().filter_map(|e| e.clone().try_into().ok()).collect()
+}