Skip to main content

Engine

Struct Engine 

Source
pub struct Engine { /* private fields */ }
Expand description

Engine for evaluating Lemma rules.

Pure Rust implementation that evaluates Lemma specs directly from the AST. Uses pre-built execution plans that are self-contained and ready for evaluation.

The engine never performs network calls. External @... references must be pre-resolved before calling add_lemma_files — either by including dep files in the file map or by calling resolve_registry_references separately (e.g. in a lemma fetch command).

Implementations§

Source§

impl Engine

Source

pub fn new() -> Self

Source

pub fn with_limits(limits: ResourceLimits) -> Self

Create an engine with custom resource limits.

Source

pub fn hash_pin( &self, spec_name: &str, effective: &DateTimeValue, ) -> Option<&str>

Get the content hash (hash pin) for the temporal version active at effective.

Source

pub fn hash_pin_for_spec(&self, spec: &Arc<LemmaSpec>) -> Option<&str>

Get the content hash for a specific spec (by arc). Used when the resolved spec is already known.

Source

pub fn all_hash_pins(&self) -> Vec<(&str, Option<String>, &str)>

Get all hash pins as (spec_name, effective_from_display, hash) triples.

Source

pub fn get_spec_by_hash_pin( &self, spec_name: &str, hash_pin: &str, ) -> Option<Arc<LemmaSpec>>

Get the spec with the given name whose content hash matches hash_pin. Returns None if no such spec exists or if multiple versions match (hash collision).

Source

pub fn add_lemma_files( &mut self, files: HashMap<String, String>, ) -> Result<(), Vec<Error>>

Add Lemma source files, parse them, and build execution plans.

External @... references must already be resolved: include dependency .lemma files in the files map. The engine never performs network calls. Use resolve_registry_references separately (e.g. in lemma fetch) to download dependencies before calling this.

  • Validates and resolves types once across all specs
  • Collects all errors across all files (parse, planning) instead of aborting on the first

files maps source identifiers (e.g. file paths) to source code. For a single file, pass a one-entry HashMap.

Source

pub fn remove_spec(&mut self, spec: Arc<LemmaSpec>)

Source

pub fn list_specs(&self) -> Vec<Arc<LemmaSpec>>

All specs, all temporal versions, ordered by (name, effective_from).

Source

pub fn list_specs_effective( &self, effective: &DateTimeValue, ) -> Vec<Arc<LemmaSpec>>

Specs active at effective (one per name).

Source

pub fn get_spec( &self, spec_name: &str, effective: &DateTimeValue, ) -> Option<Arc<LemmaSpec>>

Get spec by name at a specific time.

Source

pub fn get_execution_plan( &self, spec_name: &str, hash_pin: Option<&str>, effective: &DateTimeValue, ) -> Option<&ExecutionPlan>

Get the execution plan for a spec.

When hash_pin is Some, resolves the spec by content hash for that name, then returns the slice plan that covers effective. When hash_pin is None, resolves the temporal version active at effective then finds the covering slice plan. Returns None when the spec does not exist or has no matching plan.

Source

pub fn get_spec_rules( &self, spec_name: &str, effective: &DateTimeValue, ) -> Result<Vec<LemmaRule>, Error>

Source

pub fn evaluate_json( &self, spec_name: &str, hash_pin: Option<&str>, effective: &DateTimeValue, rule_names: Vec<String>, json: &[u8], ) -> Result<Response, Error>

Evaluate rules in a spec with JSON values for facts.

This is a convenience method that accepts JSON directly and converts it to typed values using the spec’s fact type declarations.

If rule_names is empty, evaluates all rules. Otherwise, only returns results for the specified rules (dependencies still computed).

Values are provided as JSON bytes (e.g., b"{\"quantity\": 5, \"is_member\": true}"). They are automatically parsed to the expected type based on the spec schema.

When hash_pin is Some, the spec is resolved by that content hash; otherwise by temporal resolution at effective. Evaluation uses the resolved plan.

Source

pub fn evaluate( &self, spec_name: &str, hash_pin: Option<&str>, effective: &DateTimeValue, rule_names: Vec<String>, fact_values: HashMap<String, String>, ) -> Result<Response, Error>

Evaluate rules in a spec with string values for facts.

This is the user-friendly API that accepts raw string values and parses them to the appropriate types based on the spec’s fact type declarations. Use this for CLI, HTTP APIs, and other user-facing interfaces.

If rule_names is empty, evaluates all rules. Otherwise, only returns results for the specified rules (dependencies still computed).

Fact values are provided as name -> value string pairs (e.g., “type” -> “latte”). They are automatically parsed to the expected type based on the spec schema.

When hash_pin is Some, the spec is resolved by that content hash; otherwise by temporal resolution at effective. Evaluation uses the resolved plan.

Source

pub fn invert( &self, spec_name: &str, effective: &DateTimeValue, rule_name: &str, target: Target, values: HashMap<String, String>, ) -> Result<InversionResponse, Error>

Invert a rule to find input domains that produce a desired outcome.

Values are provided as name -> value string pairs (e.g., “quantity” -> “5”). They are automatically parsed to the expected type based on the spec schema.

Trait Implementations§

Source§

impl Default for Engine

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more