use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Kind {
Goal,
Task,
Decision,
Question,
Constraint,
Finding,
Assumption,
}
impl Kind {
pub fn prefix(self) -> char {
match self {
Kind::Goal => 'g',
Kind::Task => 't',
Kind::Decision => 'd',
Kind::Question => 'q',
Kind::Constraint => 'c',
Kind::Finding => 'f',
Kind::Assumption => 'a',
}
}
pub fn parse(s: &str) -> Option<Kind> {
Some(match s {
"goal" => Kind::Goal,
"task" => Kind::Task,
"decision" => Kind::Decision,
"question" => Kind::Question,
"constraint" => Kind::Constraint,
"finding" => Kind::Finding,
"assumption" => Kind::Assumption,
_ => return None,
})
}
pub const ALL: &'static str = "goal, task, decision, question, constraint, finding, assumption";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum State {
Active,
Done,
Suspended,
Abandoned,
Superseded,
}
impl State {
pub fn is_open(self) -> bool {
self == State::Active
}
pub fn word(self, kind: Kind) -> &'static str {
match (self, kind) {
(State::Active, Kind::Decision) => "standing",
(State::Active, _) => "open",
(State::Done, Kind::Goal) => "achieved",
(State::Done, Kind::Question) => "answered",
(State::Done, _) => "closed",
(State::Suspended, _) => "parked",
(State::Abandoned, _) => "abandoned",
(State::Superseded, _) => "superseded",
}
}
pub fn mark(self) -> char {
match self {
State::Active => ' ',
State::Done => 'x',
State::Suspended => '~',
State::Abandoned => '!',
State::Superseded => '-',
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Flag {
Suspect,
Review,
Stale,
}
impl Flag {
pub fn parse(s: &str) -> Option<Flag> {
Some(match s {
"suspect" => Flag::Suspect,
"review" => Flag::Review,
"stale" | "old" => Flag::Stale,
_ => return None,
})
}
pub fn word(self) -> &'static str {
match self {
Flag::Suspect => "suspect",
Flag::Review => "review",
Flag::Stale => "stale",
}
}
pub const ALL: &'static str = "suspect, review, stale";
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum VivacKind {
Push,
Pop,
Park,
Manual,
Auto,
}
impl VivacKind {
pub fn word(self) -> &'static str {
match self {
VivacKind::Push => "push",
VivacKind::Pop => "pop",
VivacKind::Park => "park",
VivacKind::Manual => "manual",
VivacKind::Auto => "auto",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
pub seq: u64,
pub id: String,
pub ts: String,
pub actor: String,
pub lane: String,
pub payload: Body,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Body {
#[serde(rename = "node.created")]
NodeCreated {
node: String,
num: u64,
kind: Kind,
title: String,
#[serde(default)]
why: String,
#[serde(default)]
parent: Option<String>,
#[serde(default)]
blocks: bool,
#[serde(default)]
refs: Vec<String>,
#[serde(default)]
governs: Vec<String>,
},
#[serde(rename = "state.changed")]
StateChanged {
node: String,
state: State,
#[serde(default)]
outcome: String,
#[serde(default)]
forced: bool,
},
#[serde(rename = "node.noted")]
NodeNoted { node: String, note: String },
#[serde(rename = "edge.blocks")]
BlockChanged { node: String, blocks: bool },
#[serde(rename = "stack.pushed")]
Pushed { node: String },
#[serde(rename = "stack.popped")]
Popped { node: String },
#[serde(rename = "stack.promoted")]
Promoted { node: String },
#[serde(rename = "flag.raised")]
FlagRaised {
node: String,
flag: Flag,
reason: String,
},
#[serde(rename = "flag.cleared")]
FlagCleared { node: String, flag: Flag },
#[serde(rename = "vivac.created")]
VivacCreated {
vivac: String,
num: u64,
kind: VivacKind,
stack: Vec<(String, String)>,
working_set: Vec<String>,
next_intent: String,
#[serde(default)]
anchor: crate::anchor::AnchorRef,
#[serde(default)]
node_ref: Option<String>,
#[serde(default)]
label: String,
},
#[serde(rename = "session.started")]
SessionStarted {
source: String,
#[serde(default)]
focus: Option<String>,
#[serde(default)]
vivac: Option<String>,
#[serde(default)]
session: Option<String>,
},
}