Skip to main content

monoloop_interpreter/
factory.rs

1//! Interpreter factory and dialect support levels.
2
3use crate::engine::{spawn_interpretation, Interpretation, StartInterpretation};
4use monoloop_contracts::{DialectBinding, DialectFamily, InterpreterError};
5
6/// How well a factory supports a dialect binding.
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
8pub enum SupportLevel {
9    /// Full support.
10    Full,
11    /// Partial (best-effort mapping).
12    Partial,
13    /// Unsupported.
14    None,
15}
16
17/// Creates Interpretation instances for supported dialects.
18pub trait InterpreterFactory: Send + Sync {
19    /// Report support for a dialect binding.
20    fn supports(&self, dialect: &DialectBinding) -> SupportLevel;
21
22    /// Start an interpretation. Returns immediately with live handles.
23    fn start(&self, request: StartInterpretation) -> Result<Interpretation, InterpreterError>;
24}
25
26/// Default factory supporting Test + ACP/GrokBuild dialects.
27#[derive(Clone, Debug, Default)]
28pub struct DefaultInterpreterFactory;
29
30impl DefaultInterpreterFactory {
31    /// Create the default factory.
32    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}