1use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[serde(rename_all = "snake_case")]
20pub enum Role {
21 System,
23 Developer,
25 User,
27 Assistant,
29 Tool,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
39#[serde(rename_all = "snake_case")]
40pub enum Channel {
41 Analysis,
43 Commentary,
45 Final,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
55#[serde(rename_all = "snake_case")]
56pub enum ContentType {
57 Text,
59 Thinking,
61 ToolCall,
63 ToolResult,
65 Resource,
67 ResourceRef,
69 PromptRequest,
71 PromptResult,
73 Image,
75 Video,
77 Audio,
79 Document,
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
89#[serde(rename_all = "snake_case")]
90pub enum ResourceType {
91 #[default]
93 File,
94 Blob,
96 Uri,
98 Database,
100 Api,
102 Memory,
104 Artifact,
106}
107
108#[cfg(test)]
109mod tests {
110 use super::*;
111
112 #[test]
113 fn test_role_serde_roundtrip() {
114 let role = Role::Assistant;
115 let json = serde_json::to_string(&role).unwrap();
116 assert_eq!(json, "\"assistant\"");
117 let deserialized: Role = serde_json::from_str(&json).unwrap();
118 assert_eq!(deserialized, Role::Assistant);
119 }
120
121 #[test]
122 fn test_channel_serde_roundtrip() {
123 let channel = Channel::Final;
124 let json = serde_json::to_string(&channel).unwrap();
125 assert_eq!(json, "\"final\"");
126 let deserialized: Channel = serde_json::from_str(&json).unwrap();
127 assert_eq!(deserialized, Channel::Final);
128 }
129
130 #[test]
131 fn test_content_type_serde_roundtrip() {
132 let ct = ContentType::ToolCall;
133 let json = serde_json::to_string(&ct).unwrap();
134 assert_eq!(json, "\"tool_call\"");
135 let deserialized: ContentType = serde_json::from_str(&json).unwrap();
136 assert_eq!(deserialized, ContentType::ToolCall);
137 }
138
139 #[test]
140 fn test_content_type_resource_ref() {
141 let ct = ContentType::ResourceRef;
142 let json = serde_json::to_string(&ct).unwrap();
143 assert_eq!(json, "\"resource_ref\"");
144 }
145
146 #[test]
147 fn test_content_type_prompt_variants() {
148 let req = ContentType::PromptRequest;
149 let res = ContentType::PromptResult;
150 assert_eq!(serde_json::to_string(&req).unwrap(), "\"prompt_request\"");
151 assert_eq!(serde_json::to_string(&res).unwrap(), "\"prompt_result\"");
152 }
153
154 #[test]
155 fn test_resource_type_serde_roundtrip() {
156 let rt = ResourceType::Database;
157 let json = serde_json::to_string(&rt).unwrap();
158 assert_eq!(json, "\"database\"");
159 let deserialized: ResourceType = serde_json::from_str(&json).unwrap();
160 assert_eq!(deserialized, ResourceType::Database);
161 }
162
163 #[test]
164 fn test_all_roles_deserialize() {
165 for (s, expected) in &[
166 ("\"system\"", Role::System),
167 ("\"developer\"", Role::Developer),
168 ("\"user\"", Role::User),
169 ("\"assistant\"", Role::Assistant),
170 ("\"tool\"", Role::Tool),
171 ] {
172 let role: Role = serde_json::from_str(s).unwrap();
173 assert_eq!(role, *expected);
174 }
175 }
176}