claude_rust_types/domain/
message.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
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}