use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Feature {
pub id: i64,
pub priority: i32,
#[serde(default)]
pub category: String,
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub steps: Vec<String>,
#[serde(default)]
pub passes: bool,
#[serde(default)]
pub in_progress: bool,
#[serde(default)]
pub dependencies: Vec<i64>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FeatureStats {
pub total: usize,
pub passing: usize,
pub failing: usize,
pub in_progress: usize,
pub blocked: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FeatureGraphNode {
pub id: i64,
pub name: String,
pub category: String,
pub priority: i32,
pub passes: bool,
pub in_progress: bool,
pub blocked: bool,
pub dependencies: Vec<i64>,
pub dependents: Vec<i64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateFeatureInput {
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub priority: Option<i32>,
#[serde(default)]
pub category: String,
#[serde(default)]
pub steps: Vec<String>,
#[serde(default)]
pub dependencies: Vec<DependencyRef>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum DependencyRef {
Id(i64),
Index { index: usize },
}