1use serde::{Deserialize, Serialize};
2
3#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct GenerationConfig {
26 pub dockerfile: DockerfileConfig,
27 pub compose: ComposeConfig,
28 pub terraform: TerraformConfig,
29}
30
31#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct TelemetryConfig {
74 pub enabled: bool,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, Default)]
79pub struct AgentConfig {
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub openai_api_key: Option<String>,
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub anthropic_api_key: Option<String>,
86 #[serde(default = "default_provider")]
88 pub default_provider: String,
89 #[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, },
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}