1use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct FafData {
14 pub faf_version: String,
16 pub project: Project,
18
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub ai_score: Option<String>,
22
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub ai_confidence: Option<String>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub ai_tldr: Option<HashMap<String, String>>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub instant_context: Option<InstantContext>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub context_quality: Option<ContextQuality>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub stack: Option<Stack>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub human_context: Option<HumanContext>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub preferences: Option<Preferences>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub state: Option<State>,
54
55 #[serde(default, skip_serializing_if = "Vec::is_empty")]
57 pub tags: Vec<String>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct Project {
63 pub name: String,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
68 pub goal: Option<String>,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub main_language: Option<String>,
73
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub approach: Option<String>,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
80 pub version: Option<String>,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub license: Option<String>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct InstantContext {
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub what_building: Option<String>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub tech_stack: Option<String>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub deployment: Option<String>,
101
102 #[serde(default, skip_serializing_if = "Vec::is_empty")]
104 pub key_files: Vec<String>,
105
106 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
108 pub commands: HashMap<String, String>,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct Stack {
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub frontend: Option<String>,
117
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub backend: Option<String>,
121
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub database: Option<String>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub infrastructure: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub build_tool: Option<String>,
133
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub testing: Option<String>,
137
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub cicd: Option<String>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct ContextQuality {
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub slots_filled: Option<String>,
149
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub confidence: Option<String>,
153
154 #[serde(default)]
156 pub handoff_ready: bool,
157
158 #[serde(default, skip_serializing_if = "Vec::is_empty")]
160 pub missing_context: Vec<String>,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct HumanContext {
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub who: Option<String>,
169
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub what: Option<String>,
173
174 #[serde(rename = "why", skip_serializing_if = "Option::is_none")]
176 pub why_field: Option<String>,
177
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub how: Option<String>,
181
182 #[serde(rename = "where", skip_serializing_if = "Option::is_none")]
184 pub where_field: Option<String>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
188 pub when: Option<String>,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
193pub struct Preferences {
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub quality_bar: Option<String>,
197
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub testing: Option<String>,
201
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub documentation: Option<String>,
205
206 #[serde(skip_serializing_if = "Option::is_none")]
208 pub code_style: Option<String>,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize)]
213pub struct State {
214 #[serde(skip_serializing_if = "Option::is_none")]
216 pub phase: Option<String>,
217
218 #[serde(skip_serializing_if = "Option::is_none")]
220 pub version: Option<String>,
221
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub focus: Option<String>,
225
226 #[serde(default, skip_serializing_if = "Vec::is_empty")]
228 pub milestones: Vec<String>,
229}