1use super::{Agent, ClaudeCodeAgent, NoOpAgent};
2use std::sync::Arc;
3
4pub struct AgentProvider;
6
7impl AgentProvider {
8 pub fn get_agent(name: &str) -> anyhow::Result<Arc<dyn Agent>> {
10 match name {
11 "claude-code" => Ok(Arc::new(ClaudeCodeAgent::new())),
12 "no-op" => Ok(Arc::new(NoOpAgent)),
13 _ => Err(anyhow::anyhow!("Unknown agent: {}", name)),
14 }
15 }
16
17 pub fn list_agents() -> Vec<&'static str> {
19 vec!["claude-code", "no-op"]
20 }
21
22 pub fn default_agent() -> &'static str {
24 "claude-code"
25 }
26
27 pub fn is_valid_agent(name: &str) -> bool {
29 Self::list_agents().contains(&name)
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn test_agent_provider_get_agent() {
39 let agent = AgentProvider::get_agent("claude-code");
41 assert!(agent.is_ok());
42 let agent = agent.unwrap();
43 assert_eq!(agent.name(), "claude-code");
44 }
45
46 #[test]
47 fn test_agent_provider_get_invalid_agent() {
48 let agent = AgentProvider::get_agent("invalid-agent");
50 assert!(agent.is_err());
51 let err = agent.err().unwrap();
52 assert!(err.to_string().contains("Unknown agent"));
53 }
54
55 #[test]
56 fn test_agent_provider_list_agents() {
57 let agents = AgentProvider::list_agents();
58 assert!(!agents.is_empty());
59 assert!(agents.contains(&"claude-code"));
60 }
61
62 #[test]
63 fn test_agent_provider_default_agent() {
64 assert_eq!(AgentProvider::default_agent(), "claude-code");
65 }
66
67 #[test]
68 fn test_agent_provider_is_valid_agent() {
69 assert!(AgentProvider::is_valid_agent("claude-code"));
70 assert!(AgentProvider::is_valid_agent("no-op"));
71 assert!(!AgentProvider::is_valid_agent("invalid-agent"));
72 }
73
74 #[test]
75 fn test_agent_provider_get_no_op_agent() {
76 let agent = AgentProvider::get_agent("no-op");
78 assert!(agent.is_ok());
79 let agent = agent.unwrap();
80 assert_eq!(agent.name(), "no-op");
81 }
82
83 #[test]
84 fn test_agent_provider_list_includes_no_op() {
85 let agents = AgentProvider::list_agents();
86 assert!(agents.contains(&"no-op"));
87 }
88}