terminal_jarvis/presentation/models/
tool.rs

1//! Tool data models and structures
2//!
3//! Contains the core data structures for representing AI coding tools,
4//! their configurations, and authentication requirements.
5
6use crate::tools::tools_config::ToolDefinition;
7
8/// Authentication configuration for a tool
9#[derive(Debug, Clone, PartialEq)]
10pub struct ToolAuth {
11    pub env_vars: Vec<String>,
12    pub setup_url: String,
13    pub browser_auth: bool,
14    pub auth_instructions: Option<String>,
15}
16
17/// Complete tool configuration
18#[derive(Debug, Clone, PartialEq)]
19pub struct ToolConfig {
20    pub homepage: String,
21    pub documentation: String,
22    pub features: Option<Vec<String>>,
23    pub auth: ToolAuth,
24}
25
26/// Core tool representation
27#[derive(Debug, Clone, PartialEq)]
28pub struct Tool {
29    pub name: String,
30    pub display_name: String,
31    pub description: String,
32    pub cli_command: String,
33    pub config: ToolConfig,
34    pub is_installed: bool,
35    pub is_available: bool,
36}
37
38impl Tool {
39    pub fn new(
40        name: String,
41        display_name: String,
42        description: String,
43        cli_command: String,
44        config: ToolConfig,
45        is_installed: bool,
46        is_available: bool,
47    ) -> Self {
48        Self {
49            name,
50            display_name,
51            description,
52            cli_command,
53            config,
54            is_installed,
55            is_available,
56        }
57    }
58
59    pub fn from_tool_definition(
60        name: String,
61        definition: &ToolDefinition,
62        is_installed: bool,
63    ) -> Self {
64        let config = ToolConfig {
65            homepage: definition.homepage.clone(),
66            documentation: definition.documentation.clone(),
67            features: definition.features.as_ref().map(|f| {
68                vec![
69                    format!("Supports Files: {}", f.supports_files),
70                    format!("Supports Streaming: {}", f.supports_streaming),
71                    format!("Supports Conversation: {}", f.supports_conversation),
72                ]
73            }),
74            auth: ToolAuth {
75                env_vars: definition.auth.env_vars.clone(),
76                setup_url: definition.auth.setup_url.clone(),
77                browser_auth: definition.auth.browser_auth,
78                auth_instructions: definition.auth.auth_instructions.clone(),
79            },
80        };
81
82        Self::new(
83            name.clone(),
84            definition.display_name.clone(),
85            definition.description.clone(),
86            definition.cli_command.clone(),
87            config,
88            is_installed,
89            true, // Assume available unless specified otherwise
90        )
91    }
92
93    pub fn set_installed(&mut self, installed: bool) {
94        self.is_installed = installed;
95    }
96
97    pub fn is_available(&self) -> bool {
98        self.is_available
99    }
100}