Skip to main content

claude_rust_types/domain/
message.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
5#[serde(rename_all = "snake_case")]
6pub enum Role {
7    User,
8    Assistant,
9}
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(tag = "type", rename_all = "snake_case")]
13pub enum ContentBlock {
14    Text {
15        text: String,
16    },
17    ToolUse {
18        id: String,
19        name: String,
20        input: Value,
21    },
22    ToolResult {
23        tool_use_id: String,
24        content: String,
25        #[serde(skip_serializing_if = "Option::is_none")]
26        is_error: Option<bool>,
27    },
28    Thinking {
29        thinking: String,
30    },
31    Image {
32        media_type: String,
33        data: String,
34    },
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct Message {
39    pub role: Role,
40    pub content: Vec<ContentBlock>,
41}
42
43impl Message {
44    pub fn user(text: impl Into<String>) -> Self {
45        Self {
46            role: Role::User,
47            content: vec![ContentBlock::Text { text: text.into() }],
48        }
49    }
50
51    pub fn assistant(blocks: Vec<ContentBlock>) -> Self {
52        Self {
53            role: Role::Assistant,
54            content: blocks,
55        }
56    }
57}
58
59#[derive(Debug, Clone, Default, Serialize, Deserialize)]
60pub struct Conversation {
61    pub system: Option<String>,
62    pub messages: Vec<Message>,
63}
64
65impl Conversation {
66    pub fn push(&mut self, msg: Message) {
67        self.messages.push(msg);
68    }
69}