agent-id-cli 0.4.0

Portable identity registry for coding-agent sessions
Documentation
use std::fmt;

use chrono::{DateTime, Utc};
use clap::ValueEnum;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, ValueEnum)]
#[serde(rename_all = "snake_case")]
pub enum ActivityStateValue {
    Working,
    Idle,
    Waiting,
    Blocked,
    Stopped,
    Unknown,
}

impl ActivityStateValue {
    pub fn from_external(value: &str) -> Self {
        match value {
            "working" => Self::Working,
            "idle" => Self::Idle,
            "waiting" => Self::Waiting,
            "blocked" => Self::Blocked,
            "stopped" => Self::Stopped,
            _ => Self::Unknown,
        }
    }
}

impl fmt::Display for ActivityStateValue {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        let value = match self {
            Self::Working => "working",
            Self::Idle => "idle",
            Self::Waiting => "waiting",
            Self::Blocked => "blocked",
            Self::Stopped => "stopped",
            Self::Unknown => "unknown",
        };
        formatter.write_str(value)
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ActivityState {
    pub value: ActivityStateValue,
    pub updated_at: DateTime<Utc>,
}

impl ActivityState {
    pub fn unknown(updated_at: DateTime<Utc>) -> Self {
        Self {
            value: ActivityStateValue::Unknown,
            updated_at,
        }
    }

    pub fn from_external(value: &str, updated_at: DateTime<Utc>) -> Self {
        Self {
            value: ActivityStateValue::from_external(value),
            updated_at,
        }
    }
}