use serde::Deserialize;
use serde::Serialize;
use mago_interner::ThreadedInterner;
use mago_reflection::CodebaseReflection;
use crate::module::Module;
mod internal;
pub mod module;
#[derive(Debug, Clone)]
pub struct ProjectBuilder {
interner: ThreadedInterner,
reflection: CodebaseReflection,
modules: Vec<Module>,
}
impl ProjectBuilder {
pub fn new(interner: ThreadedInterner) -> Self {
Self { interner, reflection: CodebaseReflection::new(), modules: Vec::new() }
}
pub fn from_reflection(interner: ThreadedInterner, reflection: CodebaseReflection) -> Self {
Self { interner, reflection, modules: Vec::new() }
}
pub fn add_module(&mut self, mut module: Module) {
if let Some(reflection) = module.reflection.take() {
self.reflection.merge(&self.interner, reflection);
}
self.modules.push(module);
}
pub fn build(mut self, populate_non_user_defined: bool) -> Project {
internal::populator::populate(&self.interner, &mut self.reflection, populate_non_user_defined);
Project { modules: self.modules, reflection: self.reflection }
}
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Project {
pub modules: Vec<Module>,
pub reflection: CodebaseReflection,
}
impl Project {
pub fn builder(interner: ThreadedInterner) -> ProjectBuilder {
ProjectBuilder::new(interner)
}
}