jules_core/message/
mod.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum Role {
9 System,
11 #[default]
13 User,
14 Assistant,
16 Tool,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22pub struct Message {
23 role: Role,
24 content: String,
25 #[cfg(feature = "tools")]
26 #[serde(skip_serializing_if = "Option::is_none")]
27 tool_calls: Option<Vec<crate::tool::ToolCall>>,
28 #[cfg(feature = "tools")]
29 #[serde(skip_serializing_if = "Option::is_none")]
30 tool_call_id: Option<String>,
31}
32
33impl Message {
34 #[must_use]
36 pub fn new(role: Role, content: impl Into<String>) -> Self {
37 Self {
38 role,
39 content: content.into(),
40 #[cfg(feature = "tools")]
41 tool_calls: None,
42 #[cfg(feature = "tools")]
43 tool_call_id: None,
44 }
45 }
46
47 #[cfg(feature = "tools")]
49 #[must_use]
50 pub fn with_tool_calls(mut self, tool_calls: Vec<crate::tool::ToolCall>) -> Self {
51 self.tool_calls = Some(tool_calls);
52 self
53 }
54
55 #[cfg(feature = "tools")]
57 #[must_use]
58 pub fn with_tool_call_id(mut self, tool_call_id: impl Into<String>) -> Self {
59 self.tool_call_id = Some(tool_call_id.into());
60 self
61 }
62
63 #[cfg(feature = "tools")]
65 #[must_use]
66 pub fn tool_calls(&self) -> Option<&[crate::tool::ToolCall]> {
67 self.tool_calls.as_deref()
68 }
69
70 #[cfg(feature = "tools")]
72 #[must_use]
73 pub fn tool_call_id(&self) -> Option<&str> {
74 self.tool_call_id.as_deref()
75 }
76
77 #[must_use]
79 pub fn role(&self) -> &Role {
80 &self.role
81 }
82
83 #[must_use]
85 pub fn content(&self) -> &str {
86 &self.content
87 }
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93
94 #[test]
95 fn test_message_creation() {
96 let msg = Message::new(Role::User, "Hello");
97 assert_eq!(*msg.role(), Role::User);
98 assert_eq!(msg.content(), "Hello");
99 }
100}