1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct FafData {
9 pub faf_version: String,
10 pub project: Project,
11
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub ai_score: Option<String>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub ai_confidence: Option<String>,
17
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub ai_tldr: Option<HashMap<String, String>>,
20
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub instant_context: Option<InstantContext>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub context_quality: Option<ContextQuality>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub stack: Option<Stack>,
29
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub human_context: Option<HumanContext>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub preferences: Option<Preferences>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub state: Option<State>,
38
39 #[serde(default, skip_serializing_if = "Vec::is_empty")]
40 pub tags: Vec<String>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct Project {
46 pub name: String,
47
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub goal: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub main_language: Option<String>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub approach: Option<String>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub version: Option<String>,
59
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub license: Option<String>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct InstantContext {
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub what_building: Option<String>,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub tech_stack: Option<String>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub deployment: Option<String>,
75
76 #[serde(default, skip_serializing_if = "Vec::is_empty")]
77 pub key_files: Vec<String>,
78
79 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
80 pub commands: HashMap<String, String>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct Stack {
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub frontend: Option<String>,
88
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub backend: Option<String>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub database: Option<String>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub infrastructure: Option<String>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub build_tool: Option<String>,
100
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub testing: Option<String>,
103
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub cicd: Option<String>,
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct ContextQuality {
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub slots_filled: Option<String>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub confidence: Option<String>,
116
117 #[serde(default)]
118 pub handoff_ready: bool,
119
120 #[serde(default, skip_serializing_if = "Vec::is_empty")]
121 pub missing_context: Vec<String>,
122}
123
124#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct HumanContext {
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub who: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub what: Option<String>,
132
133 #[serde(rename = "why", skip_serializing_if = "Option::is_none")]
134 pub why_field: Option<String>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub how: Option<String>,
138
139 #[serde(rename = "where", skip_serializing_if = "Option::is_none")]
140 pub where_field: Option<String>,
141
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub when: Option<String>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct Preferences {
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub quality_bar: Option<String>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub testing: Option<String>,
154
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub documentation: Option<String>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub code_style: Option<String>,
160}
161
162#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct State {
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub phase: Option<String>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub version: Option<String>,
170
171 #[serde(skip_serializing_if = "Option::is_none")]
172 pub focus: Option<String>,
173
174 #[serde(default, skip_serializing_if = "Vec::is_empty")]
175 pub milestones: Vec<String>,
176}