monoloop_interpreter/
factory.rs1use crate::engine::{spawn_interpretation, Interpretation, StartInterpretation};
4use monoloop_contracts::{DialectBinding, DialectFamily, InterpreterError};
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub enum SupportLevel {
9 Full,
11 Partial,
13 None,
15}
16
17pub trait InterpreterFactory: Send + Sync {
19 fn supports(&self, dialect: &DialectBinding) -> SupportLevel;
21
22 fn start(&self, request: StartInterpretation) -> Result<Interpretation, InterpreterError>;
24}
25
26#[derive(Clone, Debug, Default)]
28pub struct DefaultInterpreterFactory;
29
30impl DefaultInterpreterFactory {
31 pub fn new() -> Self {
33 Self
34 }
35}
36
37impl InterpreterFactory for DefaultInterpreterFactory {
38 fn supports(&self, dialect: &DialectBinding) -> SupportLevel {
39 match &dialect.output.family {
40 DialectFamily::Test
41 | DialectFamily::Acp
42 | DialectFamily::GrokBuild
43 | DialectFamily::CursorAcp
44 | DialectFamily::AgyAcp
45 | DialectFamily::CodexAcp
46 | DialectFamily::ZaiCli
47 | DialectFamily::ClaudeCode
48 | DialectFamily::OpenAiChatCompletions => SupportLevel::Full,
49 _ => SupportLevel::None,
50 }
51 }
52
53 fn start(&self, request: StartInterpretation) -> Result<Interpretation, InterpreterError> {
54 if self.supports(&request.dialect) == SupportLevel::None {
55 return Err(InterpreterError::unsupported_dialect(
56 "dialect not supported by DefaultInterpreterFactory",
57 ));
58 }
59 spawn_interpretation(request)
60 }
61}