1use std::fmt;
2
3use chrono::{DateTime, Utc};
4use clap::ValueEnum;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, ValueEnum)]
8#[serde(rename_all = "snake_case")]
9pub enum ActivityStateValue {
10 Working,
11 Idle,
12 Waiting,
13 Blocked,
14 Stopped,
15 Unknown,
16}
17
18impl ActivityStateValue {
19 pub fn from_external(value: &str) -> Self {
20 match value {
21 "working" => Self::Working,
22 "idle" => Self::Idle,
23 "waiting" => Self::Waiting,
24 "blocked" => Self::Blocked,
25 "stopped" => Self::Stopped,
26 _ => Self::Unknown,
27 }
28 }
29}
30
31impl fmt::Display for ActivityStateValue {
32 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
33 let value = match self {
34 Self::Working => "working",
35 Self::Idle => "idle",
36 Self::Waiting => "waiting",
37 Self::Blocked => "blocked",
38 Self::Stopped => "stopped",
39 Self::Unknown => "unknown",
40 };
41 formatter.write_str(value)
42 }
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
46pub struct ActivityState {
47 pub value: ActivityStateValue,
48 pub updated_at: DateTime<Utc>,
49}
50
51impl ActivityState {
52 pub fn unknown(updated_at: DateTime<Utc>) -> Self {
53 Self {
54 value: ActivityStateValue::Unknown,
55 updated_at,
56 }
57 }
58
59 pub fn from_external(value: &str, updated_at: DateTime<Utc>) -> Self {
60 Self {
61 value: ActivityStateValue::from_external(value),
62 updated_at,
63 }
64 }
65}