1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct Feature {
7 pub id: i64,
8 pub priority: i32,
9 #[serde(default)]
10 pub category: String,
11 pub name: String,
12 #[serde(default)]
13 pub description: String,
14 #[serde(default)]
15 pub steps: Vec<String>,
16 #[serde(default)]
17 pub passes: bool,
18 #[serde(default)]
19 pub in_progress: bool,
20 #[serde(default)]
21 pub dependencies: Vec<i64>,
22 #[serde(default)]
23 pub created_at: Option<String>,
24 #[serde(default)]
25 pub updated_at: Option<String>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, Default)]
30#[serde(rename_all = "camelCase")]
31pub struct FeatureStats {
32 pub total: usize,
33 pub passing: usize,
34 pub failing: usize,
35 pub in_progress: usize,
36 pub blocked: usize,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct FeatureGraphNode {
43 pub id: i64,
44 pub name: String,
45 pub category: String,
46 pub priority: i32,
47 pub passes: bool,
48 pub in_progress: bool,
49 pub blocked: bool,
50 pub dependencies: Vec<i64>,
51 pub dependents: Vec<i64>,
52}
53
54#[derive(Debug, Clone, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub struct CreateFeatureInput {
58 pub name: String,
59 #[serde(default)]
60 pub description: String,
61 #[serde(default)]
62 pub priority: Option<i32>,
63 #[serde(default)]
64 pub category: String,
65 #[serde(default)]
66 pub steps: Vec<String>,
67 #[serde(default)]
68 pub dependencies: Vec<DependencyRef>,
69}
70
71#[derive(Debug, Clone, Deserialize)]
73#[serde(untagged)]
74pub enum DependencyRef {
75 Id(i64),
76 Index { index: usize },
77}