syncable_cli/config/
types.rs

1use serde::{Deserialize, Serialize};
2
3/// Main configuration structure
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Config {
6    pub analysis: AnalysisConfig,
7    pub generation: GenerationConfig,
8    pub output: OutputConfig,
9    pub telemetry: TelemetryConfig,
10    #[serde(default)]
11    pub agent: AgentConfig,
12}
13
14/// Analysis configuration
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct AnalysisConfig {
17    pub include_dev_dependencies: bool,
18    pub deep_analysis: bool,
19    pub ignore_patterns: Vec<String>,
20    pub max_file_size: usize,
21}
22
23/// Generation configuration
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct GenerationConfig {
26    pub dockerfile: DockerfileConfig,
27    pub compose: ComposeConfig,
28    pub terraform: TerraformConfig,
29}
30
31/// Dockerfile generation configuration
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct DockerfileConfig {
34    pub base_image_override: Option<String>,
35    pub use_multi_stage: bool,
36    pub optimize_for_size: bool,
37    pub include_health_check: bool,
38}
39
40/// Docker Compose generation configuration
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct ComposeConfig {
43    pub version: String,
44    pub include_database: bool,
45    pub include_redis: bool,
46}
47
48/// Terraform generation configuration
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct TerraformConfig {
51    pub provider: String,
52    pub include_networking: bool,
53    pub include_monitoring: bool,
54}
55
56/// Output configuration
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct OutputConfig {
59    pub format: OutputFormat,
60    pub overwrite_existing: bool,
61    pub create_backup: bool,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub enum OutputFormat {
66    Files,
67    Stdout,
68    Json,
69}
70
71// Telemetry configuration
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct TelemetryConfig {
74    pub enabled: bool,
75}
76
77/// Agent/Chat configuration
78#[derive(Debug, Clone, Serialize, Deserialize, Default)]
79pub struct AgentConfig {
80    /// OpenAI API key
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub openai_api_key: Option<String>,
83    /// Anthropic API key
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub anthropic_api_key: Option<String>,
86    /// Default provider (openai or anthropic)
87    #[serde(default = "default_provider")]
88    pub default_provider: String,
89    /// Default model
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub default_model: Option<String>,
92}
93
94fn default_provider() -> String {
95    "openai".to_string()
96}
97
98impl Default for Config {
99    fn default() -> Self {
100        Self {
101            analysis: AnalysisConfig {
102                include_dev_dependencies: false,
103                deep_analysis: true,
104                ignore_patterns: vec![
105                    "node_modules".to_string(),
106                    ".git".to_string(),
107                    "target".to_string(),
108                    "build".to_string(),
109                ],
110                max_file_size: 1024 * 1024, // 1MB
111            },
112            generation: GenerationConfig {
113                dockerfile: DockerfileConfig {
114                    base_image_override: None,
115                    use_multi_stage: true,
116                    optimize_for_size: true,
117                    include_health_check: true,
118                },
119                compose: ComposeConfig {
120                    version: "3.8".to_string(),
121                    include_database: false,
122                    include_redis: false,
123                },
124                terraform: TerraformConfig {
125                    provider: "docker".to_string(),
126                    include_networking: true,
127                    include_monitoring: false,
128                },
129            },
130            output: OutputConfig {
131                format: OutputFormat::Files,
132                overwrite_existing: false,
133                create_backup: true,
134            },
135            telemetry: TelemetryConfig {
136                enabled: true,
137            },
138            agent: AgentConfig::default(),
139        }
140    }
141}