Skip to content

Commit

Permalink
Merge pull request #137 from lixitrixi/rule-definition
Browse files Browse the repository at this point in the history
Rule definition
  • Loading branch information
ozgurakgun authored Jan 26, 2024
2 parents 7282e0e + 5a8a461 commit a0532d0
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions conjure_oxide/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
11 changes: 11 additions & 0 deletions conjure_oxide/src/rules/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
use conjure_core::ast::Expression;
use conjure_core::rule::{Rule, RuleApplicationError};

fn identity(expr: &Expression) -> Result<Expression, RuleApplicationError> {
Ok(expr.clone())
}

pub static IDENTITY_RULE: Rule = Rule {
name: "identity",
application: identity,
};
1 change: 1 addition & 0 deletions crates/conjure_core/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
pub mod ast;
pub mod rule;

pub mod solvers;
pub use solvers::Solver;
36 changes: 36 additions & 0 deletions crates/conjure_core/src/rule.rs
Original file line number Diff line number Diff line change
@@ -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<Expression, RuleApplicationError>,
}

impl<'a> Rule<'a> {
pub fn new(
name: &'a str,
application: fn(&Expression) -> Result<Expression, RuleApplicationError>,
) -> Self {
Self { name, application }
}

pub fn apply(&self, expr: &Expression) -> Result<Expression, RuleApplicationError> {
(self.application)(expr)
}
}

impl<'a> Display for Rule<'a> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name)
}
}

0 comments on commit a0532d0

Please sign in to comment.