sea_core/
lib.rs

1//! SEA Core — Rust implementation of DomainForge Domain Specific Language
2//!
3//! This library provides the core primitives:
4//! 1. Entity - Domain entities and concepts
5//! 2. Resource - Resources that flow between entities
6//! 3. Flow - Movement of resources between entities
7//! 4. Instance - Instances of entities with field values
8//! 5. ResourceInstance - Instances of resources
9//! 6. Mapping - Data transformation and mapping contracts
10//! 7. Projection - Output format projections
11//! 8. Policy - Validation and constraint rules
12//!
13//! ## Building
14//!
15//! ```bash
16//! cargo build
17//! cargo test
18//! cargo doc --no-deps --open
19//! ```
20//!
21//! # Example
22//!
23//! ```
24//! use sea_core::VERSION;
25//! assert_eq!(VERSION, "0.1.0");
26//! ```
27
28pub const VERSION: &str = "0.1.0";
29
30// Use a compact allocator only when compiling to wasm to avoid pulling wasm-only symbols on other targets.
31#[cfg(all(feature = "lol_alloc", target_arch = "wasm32"))]
32#[global_allocator]
33static ALLOC: lol_alloc::LockedAllocator<lol_alloc::FreeListAllocator> =
34    lol_alloc::LockedAllocator::new(lol_alloc::FreeListAllocator::new());
35
36pub mod calm;
37pub mod concept_id;
38pub mod error;
39pub mod formatter;
40pub mod graph;
41pub mod kg;
42pub mod kg_import;
43pub mod module;
44pub mod parser;
45pub mod patterns;
46pub mod policy;
47pub mod primitives;
48pub mod projection;
49pub mod registry;
50pub mod sbvr;
51pub mod semantic_version;
52pub mod units;
53pub mod uuid_module;
54pub mod validation_error;
55pub mod validation_result;
56
57#[cfg(feature = "cli")]
58pub mod cli;
59
60#[cfg(feature = "python")]
61pub mod python;
62
63#[cfg(feature = "typescript")]
64pub mod typescript;
65
66#[cfg(feature = "typescript")]
67pub use typescript::primitives::{
68    Entity as TsEntity, Flow as TsFlow, Instance as TsInstance, Resource as TsResource,
69    ResourceInstance as TsResourceInstance,
70};
71
72#[cfg(feature = "typescript")]
73pub use typescript::graph::Graph as TsGraph;
74#[cfg(feature = "typescript")]
75pub use typescript::registry::{
76    NamespaceBinding as TsNamespaceBinding, NamespaceRegistry as TsNamespaceRegistry,
77};
78
79#[cfg(feature = "wasm")]
80pub mod wasm;
81
82pub use concept_id::ConceptId;
83pub use graph::Graph;
84pub use kg::{KgError, KnowledgeGraph};
85pub use kg_import::{import_kg_rdfxml, import_kg_turtle, ImportError};
86pub use parser::{parse, parse_to_graph, parse_to_graph_with_options, ParseOptions};
87pub use patterns::Pattern;
88pub use registry::{NamespaceBinding, NamespaceRegistry, RegistryError};
89pub use sbvr::{SbvrError, SbvrModel};
90pub use semantic_version::SemanticVersion;
91pub use units::{unit_from_string, Dimension, Unit, UnitError, UnitRegistry};
92pub use uuid_module::{format_uuid, generate_uuid_v7, parse_uuid};
93pub use validation_error::{ErrorCode, Position, SourceRange, ValidationError};
94pub use validation_result::ValidationResult;
95
96#[cfg(test)]
97mod test_utils;
98
99#[cfg(test)]
100mod tests {
101    use super::*;
102
103    #[test]
104    fn test_version() {
105        assert_eq!(VERSION, "0.1.0");
106    }
107}
108
109#[cfg(feature = "python")]
110use pyo3::prelude::*;
111
112#[cfg(feature = "python")]
113#[pymodule]
114fn sea_dsl(m: &Bound<'_, PyModule>) -> PyResult<()> {
115    m.add("__version__", VERSION)?;
116
117    m.add_class::<python::primitives::Entity>()?;
118    m.add_class::<python::primitives::Resource>()?;
119    m.add_class::<python::primitives::Flow>()?;
120    m.add_class::<python::primitives::ResourceInstance>()?;
121    m.add_class::<python::primitives::Instance>()?;
122    m.add_class::<python::primitives::Mapping>()?;
123    m.add_class::<python::primitives::Projection>()?;
124    m.add_class::<python::graph::Graph>()?;
125    m.add_class::<python::primitives::Role>()?;
126    m.add_class::<python::primitives::Relation>()?;
127    m.add_class::<python::registry::NamespaceRegistry>()?;
128    m.add_class::<python::registry::NamespaceBinding>()?;
129    m.add_class::<python::policy::Severity>()?;
130    m.add_class::<python::policy::Violation>()?;
131    m.add_class::<python::policy::EvaluationResult>()?;
132    m.add_class::<python::policy::UnaryOp>()?;
133    m.add_class::<python::policy::Quantifier>()?;
134    m.add_class::<python::policy::BinaryOp>()?;
135    m.add_class::<python::policy::AggregateFunction>()?;
136    m.add_class::<python::policy::WindowSpec>()?;
137    m.add_class::<python::policy::Expression>()?;
138    m.add_class::<python::policy::NormalizedExpression>()?;
139    m.add_class::<python::units::Dimension>()?;
140    m.add_class::<python::units::Unit>()?;
141
142    // Formatter functions
143    m.add_function(pyo3::wrap_pyfunction!(python::formatter::format_source, m)?)?;
144    m.add_function(pyo3::wrap_pyfunction!(python::formatter::check_format, m)?)?;
145
146    Ok(())
147}