Skip to main content

flow_core/
feature.rs

1use serde::{Deserialize, Serialize};
2
3/// A feature tracked in `SQLite` - the primary unit of work in Flow.
4#[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/// Stats summary for features.
29#[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/// A node in the dependency graph visualization.
40#[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/// Input for creating a new feature.
55#[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/// A dependency reference - either by ID or by index within a bulk creation batch.
72#[derive(Debug, Clone, Deserialize)]
73#[serde(untagged)]
74pub enum DependencyRef {
75    Id(i64),
76    Index { index: usize },
77}