pub mod name;
pub mod loader;
pub mod definition;
pub mod import;
pub mod export;
pub mod resolver;
pub mod cache;
pub mod scheme_loader;
pub mod module_id;
pub mod module;
pub mod module_metadata;
pub mod import_spec;
pub mod export_spec;
pub mod module_system;
use crate::diagnostics::Result;
pub use module_id::*;
pub use module::*;
pub use module_metadata::*;
pub use import_spec::*;
pub use export_spec::*;
pub use module_system::*;
pub trait ModuleProvider: Send + Sync {
fn get_module(&self, id: &ModuleId) -> Result<Module>;
fn has_module(&self, id: &ModuleId) -> bool;
fn list_modules(&self) -> Vec<ModuleId>;
}
#[derive(Debug, Clone)]
pub enum ModuleError {
NotFound(ModuleId),
CircularDependency(Vec<ModuleId>),
ImportConflict(String),
InvalidDefinition(String),
ImportError(String),
ExportError(String),
CompilationError(String),
}
impl std::fmt::Display for ModuleError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ModuleError::NotFound(id) => write!(f, "Module not found: {}", format_module_id(id)),
ModuleError::CircularDependency(cycle) => {
write!(f, "Circular dependency detected: {}",
cycle.iter().map(format_module_id).collect::<Vec<_>>().join(" -> "))
}
ModuleError::ImportConflict(symbol) => write!(f, "Import conflict for symbol: {symbol}"),
ModuleError::InvalidDefinition(msg) => write!(f, "Invalid module definition: {msg}"),
ModuleError::ImportError(msg) => write!(f, "Import error: {msg}"),
ModuleError::ExportError(msg) => write!(f, "Export error: {msg}"),
ModuleError::CompilationError(msg) => write!(f, "Module compilation error: {msg}"),
}
}
}
impl std::error::Error for ModuleError {}
impl ModuleError {
pub fn boxed(self) -> Box<ModuleError> {
Box::new(self)
}
}
impl From<ModuleError> for crate::diagnostics::Error {
fn from(err: ModuleError) -> Self {
match err {
ModuleError::NotFound(id) => {
crate::diagnostics::Error::runtime_error(
format!("Module not found: {}", format_module_id(&id)),
None,
)
}
ModuleError::InvalidDefinition(msg) => {
crate::diagnostics::Error::parse_error(msg, crate::diagnostics::Span::new(0, 0))
}
ModuleError::ImportConflict(symbol) => {
crate::diagnostics::Error::runtime_error(
format!("Import conflict for symbol: {symbol}"),
None,
)
}
ModuleError::CircularDependency(cycle) => {
let cycle_str = cycle.iter()
.map(format_module_id)
.collect::<Vec<_>>()
.join(" -> ");
crate::diagnostics::Error::runtime_error(
format!("Circular dependency detected: {cycle_str}"),
None,
)
}
ModuleError::ImportError(msg) => {
crate::diagnostics::Error::runtime_error(msg, None)
}
ModuleError::ExportError(msg) => {
crate::diagnostics::Error::runtime_error(msg, None)
}
ModuleError::CompilationError(msg) => {
crate::diagnostics::Error::runtime_error(msg, None)
}
}
}
}
pub fn parse_module_id(s: &str) -> Result<ModuleId> {
name::parse_module_name(s)
}
pub use scheme_loader::{
SchemeLibraryLoader, CompiledSchemeLibrary, SchemeLibraryCache,
BootstrapConfig, CompilationContext, HotReloadManager, CacheStatistics
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_module_id_creation() {
let id = ModuleId {
components: vec!["string".to_string()],
namespace: ModuleNamespace::Builtin,
};
assert_eq!(format_module_id(&id), "(lambdust string)");
}
#[test]
fn test_module_system_creation() {
let result = ModuleSystem::new();
assert!(result.is_ok());
}
}