use crate::prelude::internal::*;
mod definition;
pub use definition::*;
mod identifier;
pub use identifier::*;
mod parse;
pub use parse::*;
mod resolve;
pub use resolve::*;
use serde::Serialize;
#[derive(Debug, PartialEq, Clone, Serialize)]
pub struct GtProjectModule {
pub path: GtModulePath,
pub module: GtModule,
pub resolve: GtpModuleResolve,
#[serde(serialize_with = "genotype_parser::miette_serde::serialize_named_source")]
pub source_code: NamedSource<String>,
}
impl GtProjectModule {
pub fn try_new(
project_resolve: &GtpResolve,
modules: &[GtProjectModuleParse],
parse: GtProjectModuleParse,
) -> Result<Self> {
let mut module_resolve = GtpModuleResolve::try_new(modules, &parse)
.map_err(|err| err.with_source_code(parse.1.source_code.clone()))?;
let mut visitor = GtpResolveVisitor::new(parse.1.module.id.clone(), project_resolve);
let parse = parse;
parse.1.module.traverse(&mut visitor);
if let Some(error) = visitor.error() {
return Err(
miette::Report::new(error.clone()).with_source_code(parse.1.source_code.clone())
);
}
module_resolve.definitions = visitor.drain_definitions();
module_resolve.reference_definition_ids = visitor.get_reference_definition_ids();
Ok(GtProjectModule {
path: parse.0,
module: parse.1.module,
resolve: module_resolve,
source_code: parse.1.source_code.clone(),
})
}
}