use std::rc::Rc;
use crate::eval::Environment;
use crate::diagnostics::Result;
use super::{
ReflectionSystem, CodeGenerator, DynamicEvaluator, ProceduralMacro,
StaticAnalyzer, EnvironmentManipulator, SecurityManager
};
#[derive(Debug)]
pub struct MetaprogrammingSystem {
reflection: ReflectionSystem,
code_generation: CodeGenerator,
dynamic_evaluation: DynamicEvaluator,
advanced_macros: ProceduralMacro,
program_analysis: StaticAnalyzer,
environment_manipulation: EnvironmentManipulator,
security: SecurityManager,
}
impl MetaprogrammingSystem {
pub fn new() -> Self {
let security = SecurityManager::new();
Self {
reflection: ReflectionSystem::new(),
code_generation: CodeGenerator::new(),
dynamic_evaluation: DynamicEvaluator::with_security(security.clone()),
advanced_macros: ProceduralMacro::new(),
program_analysis: StaticAnalyzer::new(),
environment_manipulation: EnvironmentManipulator::new(),
security,
}
}
pub fn with_security() -> Self {
let mut system = Self::new();
system.security.install_default_policies();
system
}
pub fn reflection(&self) -> &ReflectionSystem {
&self.reflection
}
pub fn code_generation(&self) -> &CodeGenerator {
&self.code_generation
}
pub fn dynamic_evaluation(&self) -> &DynamicEvaluator {
&self.dynamic_evaluation
}
pub fn advanced_macros(&self) -> &ProceduralMacro {
&self.advanced_macros
}
pub fn program_analysis(&self) -> &StaticAnalyzer {
&self.program_analysis
}
pub fn environment_manipulation(&self) -> &EnvironmentManipulator {
&self.environment_manipulation
}
pub fn security(&self) -> &SecurityManager {
&self.security
}
pub fn install_primitives(&self, env: &Rc<Environment>) -> Result<()> {
self.reflection.install_primitives(env)?;
self.code_generation.install_primitives(env)?;
self.dynamic_evaluation.install_primitives(env)?;
self.advanced_macros.install_primitives(env)?;
self.program_analysis.install_primitives(env)?;
self.environment_manipulation.install_primitives(env)?;
Ok(())
}
}
impl Default for MetaprogrammingSystem {
fn default() -> Self {
Self::with_security()
}
}