use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Role {
System,
Developer,
User,
Assistant,
Tool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Channel {
Analysis,
Commentary,
Final,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContentType {
Text,
Thinking,
ToolCall,
ToolResult,
Resource,
ResourceRef,
PromptRequest,
PromptResult,
Image,
Video,
Audio,
Document,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ResourceType {
#[default]
File,
Blob,
Uri,
Database,
Api,
Memory,
Artifact,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_role_serde_roundtrip() {
let role = Role::Assistant;
let json = serde_json::to_string(&role).unwrap();
assert_eq!(json, "\"assistant\"");
let deserialized: Role = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, Role::Assistant);
}
#[test]
fn test_channel_serde_roundtrip() {
let channel = Channel::Final;
let json = serde_json::to_string(&channel).unwrap();
assert_eq!(json, "\"final\"");
let deserialized: Channel = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, Channel::Final);
}
#[test]
fn test_content_type_serde_roundtrip() {
let ct = ContentType::ToolCall;
let json = serde_json::to_string(&ct).unwrap();
assert_eq!(json, "\"tool_call\"");
let deserialized: ContentType = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, ContentType::ToolCall);
}
#[test]
fn test_content_type_resource_ref() {
let ct = ContentType::ResourceRef;
let json = serde_json::to_string(&ct).unwrap();
assert_eq!(json, "\"resource_ref\"");
}
#[test]
fn test_content_type_prompt_variants() {
let req = ContentType::PromptRequest;
let res = ContentType::PromptResult;
assert_eq!(serde_json::to_string(&req).unwrap(), "\"prompt_request\"");
assert_eq!(serde_json::to_string(&res).unwrap(), "\"prompt_result\"");
}
#[test]
fn test_resource_type_serde_roundtrip() {
let rt = ResourceType::Database;
let json = serde_json::to_string(&rt).unwrap();
assert_eq!(json, "\"database\"");
let deserialized: ResourceType = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, ResourceType::Database);
}
#[test]
fn test_all_roles_deserialize() {
for (s, expected) in &[
("\"system\"", Role::System),
("\"developer\"", Role::Developer),
("\"user\"", Role::User),
("\"assistant\"", Role::Assistant),
("\"tool\"", Role::Tool),
] {
let role: Role = serde_json::from_str(s).unwrap();
assert_eq!(role, *expected);
}
}
}