#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ModuleId {
pub components: Vec<String>,
pub namespace: ModuleNamespace,
}
impl ModuleId {
pub fn new(namespace: ModuleNamespace, components: Vec<String>) -> Self {
Self { namespace, components }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum ModuleNamespace {
Builtin,
R7RS,
SRFI,
User,
File,
}
pub fn format_module_id(id: &ModuleId) -> String {
match id.namespace {
ModuleNamespace::Builtin => format!("(lambdust {})", id.components.join(" ")),
ModuleNamespace::R7RS => format!("(scheme {})", id.components.join(" ")),
ModuleNamespace::SRFI => {
if id.components.len() == 1 {
format!("(srfi {})", id.components[0])
} else {
format!("(srfi ({}))", id.components.join(" "))
}
}
ModuleNamespace::User => format!("(user {})", id.components.join(" ")),
ModuleNamespace::File => format!("(file \"{}\")", id.components.join("/")),
}
}