1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
7#[serde(rename_all = "kebab-case")]
8pub enum HostId {
9 MurAgent,
10 MurCommander,
11 #[default]
13 All,
14 #[serde(untagged)]
15 Custom(String),
16}
17
18#[derive(
20 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, PartialOrd, Ord, Default,
21)]
22#[serde(rename_all = "kebab-case")]
23pub enum TrustLevel {
24 #[default]
26 Sandboxed,
27 Verified,
29 Trusted,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
35#[serde(rename_all = "lowercase")]
36pub enum Category {
37 Context,
38 Workflow,
39 Command,
40 Meta,
41 Note,
42 Media,
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
51#[serde(rename_all = "lowercase")]
52pub enum Provenance {
53 #[default]
55 Human,
56 Llm,
58 Hybrid,
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
64#[serde(rename_all = "lowercase")]
65pub enum ContentMode {
66 Context,
67 Workflow,
68 Command,
69 Note,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
73#[serde(rename_all = "lowercase")]
74pub enum Priority {
75 Low,
76 #[default]
77 Normal,
78 High,
79 Critical,
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Ord, PartialOrd)]
83#[serde(rename_all = "snake_case")]
84pub enum TriggerKind {
85 Command,
86 Keyword,
87 SessionStart,
88 Manual,
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94
95 #[test]
96 fn host_id_serialises_kebab_case() {
97 let yaml = serde_yaml_ng::to_string(&HostId::MurAgent).unwrap();
98 assert_eq!(yaml.trim(), "mur-agent");
99 }
100
101 #[test]
102 fn trust_level_ordering_matches_spec() {
103 assert!(TrustLevel::Sandboxed < TrustLevel::Verified);
104 assert!(TrustLevel::Verified < TrustLevel::Trusted);
105 }
106
107 #[test]
108 fn host_id_default_is_all() {
109 assert_eq!(HostId::default(), HostId::All);
110 }
111
112 #[test]
113 fn note_category_serialises_lowercase_and_roundtrips() {
114 let yaml = serde_yaml_ng::to_string(&Category::Note).unwrap();
115 assert_eq!(yaml.trim(), "note");
116 let parsed: Category = serde_yaml_ng::from_str("note").unwrap();
117 assert_eq!(parsed, Category::Note);
118 }
119
120 #[test]
121 fn media_category_serialises_lowercase_and_roundtrips() {
122 let yaml = serde_yaml_ng::to_string(&Category::Media).unwrap();
123 assert_eq!(yaml.trim(), "media");
124 let parsed: Category = serde_yaml_ng::from_str("media").unwrap();
125 assert_eq!(parsed, Category::Media);
126 }
127
128 #[test]
129 fn note_content_mode_serialises_lowercase_and_roundtrips() {
130 let yaml = serde_yaml_ng::to_string(&ContentMode::Note).unwrap();
131 assert_eq!(yaml.trim(), "note");
132 let parsed: ContentMode = serde_yaml_ng::from_str("note").unwrap();
133 assert_eq!(parsed, ContentMode::Note);
134 }
135
136 #[test]
137 fn provenance_defaults_to_human_and_roundtrips() {
138 assert_eq!(Provenance::default(), Provenance::Human);
140 let yaml = serde_yaml_ng::to_string(&Provenance::Llm).unwrap();
142 assert_eq!(yaml.trim(), "llm");
143 let parsed: Provenance = serde_yaml_ng::from_str("hybrid").unwrap();
144 assert_eq!(parsed, Provenance::Hybrid);
145 }
146}