use crate::types::CliTool;
use super::claude::{ClaudePipeBuilder, ClaudeOutputParser, ClaudePromptSubmitter};
use super::codex::{CodexPipeBuilder, CodexOutputParser, CodexPromptSubmitter};
use super::cursor::CursorPipeBuilder;
use super::gemini::{GeminiPipeBuilder, GeminiOutputParser, GeminiPromptSubmitter};
use super::openclaw::OpenClawPipeBuilder;
use super::opencode::OpenCodePipeBuilder;
use super::pipeline::ClassificationPipeline;
use super::traits::{CliCommandBuilder, OutputParser, PromptSubmitter};
pub fn create_parser(tool: CliTool) -> Box<dyn OutputParser> {
match tool {
CliTool::ClaudeCode => Box::new(ClaudeOutputParser::new()),
CliTool::Codex => Box::new(CodexOutputParser::new()),
CliTool::Gemini => Box::new(GeminiOutputParser::new()),
CliTool::Cursor | CliTool::OpenCode | CliTool::OpenClaw => {
Box::new(ClaudeOutputParser::new())
}
}
}
pub fn create_submitter(tool: CliTool) -> Box<dyn PromptSubmitter> {
match tool {
CliTool::ClaudeCode => Box::new(ClaudePromptSubmitter::new()),
CliTool::Codex => Box::new(CodexPromptSubmitter::new()),
CliTool::Gemini => Box::new(GeminiPromptSubmitter::new()),
CliTool::Cursor | CliTool::OpenCode | CliTool::OpenClaw => {
Box::new(ClaudePromptSubmitter::new())
}
}
}
pub fn create_pipeline(tool: CliTool) -> ClassificationPipeline {
ClassificationPipeline::new(create_parser(tool))
}
pub fn cli_builder(tool: CliTool) -> Box<dyn CliCommandBuilder> {
match tool {
CliTool::ClaudeCode => Box::new(ClaudePipeBuilder),
CliTool::Codex => Box::new(CodexPipeBuilder),
CliTool::Gemini => Box::new(GeminiPipeBuilder),
CliTool::Cursor => Box::new(CursorPipeBuilder),
CliTool::OpenCode => Box::new(OpenCodePipeBuilder),
CliTool::OpenClaw => Box::new(OpenClawPipeBuilder),
}
}