use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TodoWriteInput {
pub todos: Vec<TodoItemInput>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TodoItemInput {
pub key: Option<String>,
pub description: String,
#[serde(default = "default_status")]
pub status: TodoStatus,
pub depends_on: Option<Vec<String>>,
}
fn default_status() -> TodoStatus {
TodoStatus::Pending
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TodoStatus {
Pending,
InProgress,
Completed,
Cancelled,
}
impl std::fmt::Display for TodoStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
TodoStatus::Pending => "pending",
TodoStatus::InProgress => "in_progress",
TodoStatus::Completed => "completed",
TodoStatus::Cancelled => "cancelled",
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TodoItem {
pub id: String,
pub description: String,
pub status: TodoStatus,
pub depends_on: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TodoList {
pub items: Vec<TodoItem>,
}
#[derive(Debug, Clone, Serialize)]
pub struct Nag {
pub message: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct TodoWriteOutput {
pub list: TodoList,
pub nags: Vec<Nag>,
}
#[derive(Debug, Clone, thiserror::Error)]
#[error("{0}")]
pub struct PlanError(pub String);