spool 1.2.0

Git-native, event-sourced task management
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
    pub v: u32,
    pub op: Operation,
    pub id: String,
    pub ts: DateTime<Utc>,
    pub by: String,
    pub branch: String,
    pub d: serde_json::Value,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Operation {
    // Task operations
    Create,
    Update,
    Assign,
    Comment,
    Link,
    Unlink,
    Complete,
    Reopen,
    Archive,
    SetStream,
    // Stream operations
    CreateStream,
    UpdateStream,
    DeleteStream,
}

impl std::fmt::Display for Operation {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Operation::Create => write!(f, "create"),
            Operation::Update => write!(f, "update"),
            Operation::Assign => write!(f, "assign"),
            Operation::Comment => write!(f, "comment"),
            Operation::Link => write!(f, "link"),
            Operation::Unlink => write!(f, "unlink"),
            Operation::Complete => write!(f, "complete"),
            Operation::Reopen => write!(f, "reopen"),
            Operation::Archive => write!(f, "archive"),
            Operation::SetStream => write!(f, "set_stream"),
            Operation::CreateStream => write!(f, "create_stream"),
            Operation::UpdateStream => write!(f, "update_stream"),
            Operation::DeleteStream => write!(f, "delete_stream"),
        }
    }
}