use crate::{
Identifier,
builtin::{BuiltinConstant, BuiltinWorkbenchDefinition},
lower::ir,
symbol::{Symbol, SymbolDef},
value::Value,
};
pub struct ModuleBuilder {
module: Symbol,
}
impl ModuleBuilder {
pub fn new(id: impl Into<Identifier>) -> Self {
Self {
module: Symbol::new(
SymbolDef::Module(ir::ModuleDefinition::new(ir::Visibility::Public, id.into())),
None,
),
}
}
pub fn symbol(self, symbol: Symbol) -> Self {
Symbol::add_child(&self.module, symbol);
self
}
pub fn builtin<T: BuiltinWorkbenchDefinition>(self) -> Self {
self.symbol(T::symbol())
}
pub fn pub_const(self, id: &str, value: impl Into<Value>) -> Self {
let value = value.into();
self.symbol(Symbol::new_builtin(BuiltinConstant {
id: Identifier::no_ref(id),
value,
doc: None,
}))
}
pub fn build(self) -> Symbol {
self.module
}
}