Skip to main content

lemma/
lib.rs

1//! # Lemma Engine
2//!
3//! **Rules for man and machine**
4//!
5//! Consumer API: **`load`** → **`list`** → **`show`** / **`source`** → **`run`**.
6
7#[cfg(test)]
8mod tests;
9
10pub(crate) mod computation;
11pub mod documentation;
12pub(crate) mod engine;
13pub(crate) mod error;
14pub(crate) mod evaluation;
15pub(crate) mod formatting;
16pub(crate) mod limits;
17pub(crate) mod literals;
18pub(crate) mod parsing;
19pub(crate) mod planning;
20pub mod quality;
21pub(crate) mod registry;
22pub mod result_value;
23pub(crate) mod spec_set_id;
24pub(crate) mod stdlib;
25pub(crate) mod string_distance;
26
27#[cfg(not(target_arch = "wasm32"))]
28pub mod deps;
29
30#[cfg(not(target_arch = "wasm32"))]
31pub mod mcp;
32
33#[cfg(target_arch = "wasm32")]
34pub mod wasm;
35
36pub use computation::{OperationResult, VetoType};
37pub use engine::{
38    resolve_effective, Engine, Errors, ListedSpec, ResolvedRepository, EMBEDDED_STDLIB_REPOSITORY,
39};
40pub use error::{EngineError, EngineErrorSource, Error, ErrorDetails, ErrorKind, RequestErrorKind};
41pub use evaluation::explanations::{format_explanation, Cause, Explanation, ExplanationNode};
42pub use evaluation::response::{Response, RuleResult};
43pub use evaluation::run_data::{
44    parse_run_data_object, resolve_run_rules, run_data_value_from_json_value, RunDataValue,
45};
46pub use formatting::{format_parse_result, format_source, format_specs};
47pub use limits::{
48    ResourceLimits, MAX_DATA_NAME_LENGTH, MAX_RULE_NAME_LENGTH, MAX_SPEC_NAME_LENGTH,
49};
50pub use literals::{DateGranularity, MeasureUnit, MeasureUnits, RatioUnit, RatioUnits};
51pub use parsing::ast::DateTimeValue;
52pub use parsing::source::SourceType;
53pub use planning::execution_plan::type_detail_lines;
54pub use planning::execution_plan::{Show, ShowData, ShowVersion};
55pub use planning::explanation::{ConversionTraceRole, SerializedConversionTraceStep};
56pub use planning::semantics::{DataPath, LemmaType, LiteralValue, TypeSpecification, ValueKind};
57pub use result_value::{CalendarResult, RangeResult, RuleResultValue, RuleResultValueFailure};
58pub use spec_set_id::parse_spec_set_id;
59pub use stdlib::UNITS_LEMMA;
60
61/// Exact rational helpers for in-tree integration tests. Not a supported consumer API.
62#[doc(hidden)]
63pub mod __test_support {
64    pub use crate::computation::rational::{
65        checked_div, checked_mul, decimal_to_rational, rational_new,
66    };
67    pub use crate::literals::TimeValue;
68    pub use crate::planning::semantics::{SemanticDateTime, SemanticTime, SemanticTimezone};
69
70    /// Serializes an [`Error`](crate::Error) as [`EngineError`](crate::EngineError).
71    pub fn current_binding_error_json(error: &crate::Error) -> serde_json::Value {
72        serde_json::to_value(crate::EngineError::from(error))
73            .expect("BUG: EngineError must serialize")
74    }
75}
76
77// Tier 1 — language surface (always)
78pub use parsing::ast::{
79    try_parse_type_constraint_command, DataValue, Span, SpecRef, TimezoneValue,
80};
81pub use parsing::lexer::{Lexer, TokenKind};
82pub use parsing::source::Source;
83pub use parsing::{parse, ParseResult};
84pub use quality::Recommendation;
85
86// Tier 2 — registry network (feature-gated)
87#[cfg(feature = "registry")]
88pub use engine::Context;
89#[cfg(feature = "registry")]
90pub use parsing::ast::{LemmaRepository, LemmaSpec};
91#[cfg(feature = "registry")]
92pub use planning::LemmaSpecSet;
93#[cfg(all(feature = "registry", not(target_arch = "wasm32")))]
94pub use registry::resolve_registry_references;
95pub use registry::RegistryErrorKind;
96#[cfg(feature = "registry")]
97pub use registry::{LemmaBase, Registry, RegistryBundle, RegistryError};