Skip to main content

faf_rust_sdk/
types.rs

1//! Type definitions for FAF format
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Complete FAF file structure
7#[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/// Project metadata
44#[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/// Instant context for AI
65#[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/// Technical stack
84#[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/// Context quality metrics
109#[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/// Human context - the 6 W's
125#[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/// Development preferences
147#[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/// Project state
163#[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}