diff --git a/conjure_oxide/src/lib.rs b/conjure_oxide/src/lib.rs index c2c17a283..e7f1a854a 100644 --- a/conjure_oxide/src/lib.rs +++ b/conjure_oxide/src/lib.rs @@ -1,6 +1,7 @@ pub mod error; pub mod find_conjure; pub mod parse; +pub mod rules; mod solvers; pub use conjure_core::ast; // re-export core::ast as conjure_oxide::ast diff --git a/conjure_oxide/src/rules/mod.rs b/conjure_oxide/src/rules/mod.rs new file mode 100644 index 000000000..3911c82ed --- /dev/null +++ b/conjure_oxide/src/rules/mod.rs @@ -0,0 +1,11 @@ +use conjure_core::ast::Expression; +use conjure_core::rule::{Rule, RuleApplicationError}; + +fn identity(expr: &Expression) -> Result { + Ok(expr.clone()) +} + +pub static IDENTITY_RULE: Rule = Rule { + name: "identity", + application: identity, +}; diff --git a/crates/conjure_core/src/lib.rs b/crates/conjure_core/src/lib.rs index 6471a8b4f..df41804d3 100644 --- a/crates/conjure_core/src/lib.rs +++ b/crates/conjure_core/src/lib.rs @@ -1,4 +1,5 @@ pub mod ast; +pub mod rule; pub mod solvers; pub use solvers::Solver; diff --git a/crates/conjure_core/src/rule.rs b/crates/conjure_core/src/rule.rs new file mode 100644 index 000000000..059e738a9 --- /dev/null +++ b/crates/conjure_core/src/rule.rs @@ -0,0 +1,36 @@ +use std::fmt::{self, Display, Formatter}; + +use thiserror::Error; + +use crate::ast::Expression; + +#[derive(Debug, Error)] +pub enum RuleApplicationError { + #[error("Rule is not applicable")] + RuleNotApplicable, +} + +#[derive(Clone, Debug)] +pub struct Rule<'a> { + pub name: &'a str, + pub application: fn(&Expression) -> Result, +} + +impl<'a> Rule<'a> { + pub fn new( + name: &'a str, + application: fn(&Expression) -> Result, + ) -> Self { + Self { name, application } + } + + pub fn apply(&self, expr: &Expression) -> Result { + (self.application)(expr) + } +} + +impl<'a> Display for Rule<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) + } +}