use crate::error::AamlError;
use crate::pipeline::ExecutionContext;
use crate::types_aam::primitive_type::PrimitiveType;
pub(crate) mod list;
mod math;
pub(crate) mod physics;
pub(crate) mod primitive_type;
mod time;
pub trait TypeAAM {
fn from_name(name: &str) -> Result<Self, AamlError>
where
Self: Sized;
fn base_type(&self) -> PrimitiveType;
fn validate(&self, value: &str, context: &ExecutionContext) -> Result<(), AamlError>;
}
pub fn resolve_builtin(path: &str) -> Result<Box<dyn TypeAAM>, AamlError> {
if let Some(inner) = list::ListType::parse_inner(path) {
return Ok(Box::new(list::ListType::new(inner)));
}
let parts: Vec<&str> = path.splitn(2, "::").collect();
match parts.as_slice() {
["math", name] => Ok(Box::new(math::MathTypes::from_name(name)?)),
["time", name] => Ok(Box::new(time::TimeTypes::from_name(name)?)),
["physics", name] => Ok(Box::new(physics::PhysicsTypes::from_name(name)?)),
[name] => Ok(Box::new(PrimitiveType::from_name(name)?)),
_ => Err(AamlError::NotFound {
key: path.to_string(),
context: "builtin types".to_string(),
diagnostics: Some(crate::error::ErrorDiagnostics::new(
"Unknown builtin type",
format!("Type path '{}' does not match any builtin type", path),
"Valid formats: math::vector3, time::datetime, physics::kilogram, i32, list<i32>, etc.",
)),
}),
}
}