use crate::prelude::internal::*;
mod parse;
pub use parse::*;
mod resolve;
pub use resolve::*;
mod type_check;
pub use type_check::*;
mod error;
pub use error::*;
mod source;
pub use source::*;
#[derive(Debug, PartialEq, Clone, Serialize)]
pub enum GtpModule {
Initialized(GtpModuleSource),
Error(GtpModuleSource, GtpModuleError),
Parsed(Box<GtpModuleParse>),
Resolved(Box<GtpModuleResolved>),
TypeChecked(Box<GtpModuleTypeChecked>),
}
impl GtpModule {
pub fn state_name(&self) -> &'static str {
match self {
GtpModule::Initialized(_) => "initialized",
GtpModule::Error(_, _) => "error",
GtpModule::Parsed(_) => "parsed",
GtpModule::Resolved(_) => "resolved",
GtpModule::TypeChecked(_) => "type checked",
}
}
pub fn module_parse(&self) -> Option<&GtModuleParse> {
self.project_module_parse().map(|parse| &parse.module_parse)
}
pub fn project_module_parse(&self) -> Option<&GtpModuleParse> {
match self {
GtpModule::Initialized(_) => None,
GtpModule::Error(_, _) => None,
GtpModule::Parsed(state) => Some(state),
GtpModule::Resolved(state) => Some(&state.project_module_parse),
GtpModule::TypeChecked(state) => Some(&state.module_resolved.project_module_parse),
}
}
pub fn path(&self) -> &GtpModulePath {
match self {
GtpModule::Initialized(source) => source.path(),
GtpModule::Error(source, _) => source.path(),
GtpModule::Parsed(state) => &state.path,
GtpModule::Resolved(state) => &state.project_module_parse.path,
GtpModule::TypeChecked(state) => &state.module_resolved.project_module_parse.path,
}
}
pub fn source(&self) -> &GtpModuleSource {
match self {
GtpModule::Initialized(source) => source,
GtpModule::Error(source, _) => source,
GtpModule::Parsed(state) => &state.source,
GtpModule::Resolved(state) => &state.project_module_parse.source,
GtpModule::TypeChecked(state) => &state.module_resolved.project_module_parse.source,
}
}
pub fn source_code(&self) -> Option<&str> {
match self {
GtpModule::Initialized(_) => None,
GtpModule::Error(_, _) => None,
GtpModule::Parsed(state) => Some(&state.source_code.content),
GtpModule::Resolved(state) => Some(&state.project_module_parse.source_code.content),
GtpModule::TypeChecked(state) => Some(
&state
.module_resolved
.project_module_parse
.source_code
.content,
),
}
}
}