use std::collections::HashMap;
use std::fmt;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ModulePath {
pub components: Vec<String>,
}
impl fmt::Display for ModulePath {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.components.join("."))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ImportDecl {
pub module: ModulePath,
pub alias: Option<String>,
pub selective: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ModuleInfo {
pub path: PathBuf,
pub exports: Vec<String>,
pub dependencies: Vec<ModulePath>,
}
#[derive(Debug, Clone)]
pub struct ModuleRegistry {
pub roots: Vec<PathBuf>,
pub cache: HashMap<ModulePath, ModuleInfo>,
}
#[derive(Debug, Clone, Default)]
pub struct ModuleGraph {
pub nodes: HashMap<ModulePath, ModuleInfo>,
pub edges: Vec<(ModulePath, ModulePath)>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CycleError {
pub cycle: Vec<ModulePath>,
}
impl fmt::Display for CycleError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let names: Vec<String> = self.cycle.iter().map(|p| p.to_string()).collect();
write!(f, "import cycle detected: {}", names.join(" → "))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ModuleResolutionResult {
Found(ModuleInfo),
NotFound(ModulePath),
Cycle(CycleError),
}