use crate::engine::{spawn_interpretation, Interpretation, StartInterpretation};
use monoloop_contracts::{DialectBinding, DialectFamily, InterpreterError};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SupportLevel {
Full,
Partial,
None,
}
pub trait InterpreterFactory: Send + Sync {
fn supports(&self, dialect: &DialectBinding) -> SupportLevel;
fn start(&self, request: StartInterpretation) -> Result<Interpretation, InterpreterError>;
}
#[derive(Clone, Debug, Default)]
pub struct DefaultInterpreterFactory;
impl DefaultInterpreterFactory {
pub fn new() -> Self {
Self
}
}
impl InterpreterFactory for DefaultInterpreterFactory {
fn supports(&self, dialect: &DialectBinding) -> SupportLevel {
match &dialect.output.family {
DialectFamily::Test
| DialectFamily::Acp
| DialectFamily::GrokBuild
| DialectFamily::CursorAcp
| DialectFamily::AgyAcp
| DialectFamily::CodexAcp
| DialectFamily::ZaiCli
| DialectFamily::ClaudeCode
| DialectFamily::OpenAiChatCompletions => SupportLevel::Full,
_ => SupportLevel::None,
}
}
fn start(&self, request: StartInterpretation) -> Result<Interpretation, InterpreterError> {
if self.supports(&request.dialect) == SupportLevel::None {
return Err(InterpreterError::unsupported_dialect(
"dialect not supported by DefaultInterpreterFactory",
));
}
spawn_interpretation(request)
}
}