#![doc(html_root_url = "https://docs.rs/metadol/0.0.1")]
#![warn(missing_docs)]
#![warn(rustdoc::missing_crate_level_docs)]
pub mod ast;
pub mod codegen;
pub mod error;
pub mod eval;
pub mod hir;
pub mod lexer;
pub mod lower;
pub mod macros;
pub mod parser;
pub mod pratt;
pub mod reflect;
pub mod sex;
pub mod transform;
pub mod typechecker;
pub mod validator;
pub mod manifest;
pub mod system;
pub mod network;
pub mod swarm;
pub mod repl;
#[cfg(feature = "serde")]
pub mod mcp;
pub mod mlir;
#[cfg(any(feature = "wasm-compile", feature = "wasm-runtime"))]
pub mod wasm;
#[cfg(feature = "wasm-compile")]
pub mod compiler;
#[cfg(feature = "cli")]
pub mod test_parser;
pub use ast::{Declaration, DolFile, Evo, Gen, Rule, Span, Statement, System, Trait};
#[allow(deprecated)]
pub use ast::{Constraint, Evolution, Gene};
pub use error::{LexError, ParseError, ValidationError};
pub use eval::{EvalError, Interpreter, Value};
pub use lexer::{Lexer, Token, TokenKind};
pub use parser::Parser;
pub use typechecker::{Type, TypeChecker, TypeEnv, TypeError};
pub use validator::{validate, ValidationResult};
pub use codegen::{
Codegen, CodegenOptions, JsonSchemaCodegen, RustCodegen, TypeMapper, TypeScriptCodegen,
Visibility,
};
pub use macros::{
AttributeArg, BuiltinMacros, Macro, MacroAttribute, MacroContext, MacroError, MacroExpander,
MacroInput, MacroInvocation, MacroOutput,
};
pub use transform::{
ConstantFolding, DeadCodeElimination, Fold, MutVisitor, Pass, PassConfig, PassError,
PassPipeline, PassResult, PassStats, Visitor,
};
pub use reflect::{FieldInfo, MethodInfo, TypeInfo, TypeKind, TypeRegistry};
pub use sex::{
file_sex_context, is_sex_file, EffectTracker, FileContext, LintResult, SexContext,
SexLintError, SexLintWarning, SexLinter,
};
pub use network::{
Edge, GrowthParams, GrowthSimulator, NodeId, ResourceExplorer, ResourceGradient, ResourceType,
Topology, TopologyMetrics,
};
pub use swarm::{AgentRole, HyphalAgent, HyphalSwarm, SwarmMessage, SwarmMetrics};
pub use repl::{
EvalResult, ReplContext, ReplError, ReplEvaluator, ReplSession, SessionConfig, SpiritRepl,
};
#[cfg(feature = "mlir")]
pub use mlir::{CodegenError, CodegenResult, MlirCodegen, MlirContext};
pub use mlir::MlirError;
#[cfg(any(feature = "wasm-compile", feature = "wasm-runtime"))]
pub use wasm::WasmError;
#[cfg(feature = "wasm-compile")]
pub use wasm::WasmCompiler;
#[cfg(feature = "wasm-runtime")]
pub use wasm::{WasmModule, WasmRuntime};
#[cfg(feature = "wasm-compile")]
pub use compiler::spirit::{
compile_file, compile_source, compile_spirit_project, CompiledSpirit, CompilerError,
CompilerWarning, SourceMap, SourceMapEntry,
};
pub fn parse_file(source: &str) -> Result<Declaration, ParseError> {
let mut parser = Parser::new(source);
parser.parse()
}
pub fn parse_file_all(source: &str) -> Result<Vec<Declaration>, ParseError> {
let mut parser = Parser::new(source);
parser.parse_all()
}
pub fn parse_dol_file(source: &str) -> Result<ast::DolFile, ParseError> {
let mut parser = Parser::new(source);
parser.parse_file()
}
pub fn parse_and_validate(source: &str) -> Result<(Declaration, ValidationResult), ParseError> {
let decl = parse_file(source)?;
let validation = validate(&decl);
Ok((decl, validation))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_simple_gene() {
let source = r#"
gene container.exists {
container has identity
}
exegesis {
A container is the fundamental unit.
}
"#;
let result = parse_file(source);
assert!(result.is_ok());
}
#[test]
fn test_parse_missing_exegesis() {
let source = r#"
gene container.exists {
container has identity
}
"#;
let result = parse_file(source);
assert!(result.is_ok());
}
}