use std::fmt::{Display, Formatter};
use crate::macros::{
impl_display_for_serialize, impl_enum_string_serialization,
};
use crate::messages::{
ClaudeModel, Content, Message, Role, StopReason, StopSequence, Usage,
};
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct MessagesResponseBody {
pub id: String,
#[serde(rename = "type")]
pub _type: MessageObjectType,
pub role: Role,
pub content: Content,
pub model: ClaudeModel,
pub stop_reason: Option<StopReason>,
pub stop_sequence: Option<StopSequence>,
pub usage: Usage,
}
impl Default for MessagesResponseBody {
fn default() -> Self {
Self {
id: Default::default(),
_type: Default::default(),
role: Role::Assistant,
content: Default::default(),
model: Default::default(),
stop_reason: Default::default(),
stop_sequence: Default::default(),
usage: Default::default(),
}
}
}
impl_display_for_serialize!(MessagesResponseBody);
impl MessagesResponseBody {
pub fn crate_message(self) -> Message {
Message {
role: self.role,
content: self.content,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageObjectType {
Message,
}
impl Default for MessageObjectType {
fn default() -> Self {
Self::Message
}
}
impl Display for MessageObjectType {
fn fmt(
&self,
f: &mut Formatter<'_>,
) -> std::fmt::Result {
match self {
| MessageObjectType::Message => write!(f, "message"),
}
}
}
impl_enum_string_serialization!(
MessageObjectType,
Message => "message"
);
#[cfg(test)]
mod tests {
use crate::messages::*;
use super::*;
#[test]
fn serialize() {
let response = MessagesResponseBody {
id: "id".to_string(),
_type: MessageObjectType::Message,
role: Role::Assistant,
content: "content".into(),
model: ClaudeModel::Claude3Sonnet20240229,
stop_reason: Some(StopReason::EndTurn),
stop_sequence: Some(StopSequence::new("stop_sequence")),
usage: Usage {
input_tokens: 1,
output_tokens: 2,
cache_read_input_tokens: None,
cache_creation_input_tokens: None,
cache_creation: None,
},
};
assert_eq!(
serde_json::to_string(&response).unwrap(),
"{\"id\":\"id\",\"type\":\"message\",\"role\":\"assistant\",\"content\":\"content\",\"model\":\"claude-3-sonnet-20240229\",\"stop_reason\":\"end_turn\",\"stop_sequence\":\"stop_sequence\",\"usage\":{\"input_tokens\":1,\"output_tokens\":2}}"
);
}
#[test]
fn deserialize() {
let response = MessagesResponseBody {
id: "id".to_string(),
_type: MessageObjectType::Message,
role: Role::Assistant,
content: "content".into(),
model: ClaudeModel::Claude3Sonnet20240229,
stop_reason: Some(StopReason::EndTurn),
stop_sequence: Some(StopSequence::new("stop_sequence")),
usage: Usage {
input_tokens: 1,
output_tokens: 2,
cache_read_input_tokens: None,
cache_creation_input_tokens: None,
cache_creation: None,
},
};
assert_eq!(
serde_json::from_str::<MessagesResponseBody>(
"{\"id\":\"id\",\"type\":\"message\",\"role\":\"assistant\",\"content\":\"content\",\"model\":\"claude-3-sonnet-20240229\",\"stop_reason\":\"end_turn\",\"stop_sequence\":\"stop_sequence\",\"usage\":{\"input_tokens\":1,\"output_tokens\":2}}"
).unwrap(),
response
);
}
#[test]
fn display() {
let response = MessagesResponseBody {
id: "id".to_string(),
_type: MessageObjectType::Message,
role: Role::Assistant,
content: "content".into(),
model: ClaudeModel::Claude3Sonnet20240229,
stop_reason: Some(StopReason::EndTurn),
stop_sequence: Some(StopSequence::new("stop_sequence")),
usage: Usage {
input_tokens: 1,
output_tokens: 2,
cache_read_input_tokens: None,
cache_creation_input_tokens: None,
cache_creation: None,
},
};
assert_eq!(
response.to_string(),
"{\n \"id\": \"id\",\n \"type\": \"message\",\n \"role\": \"assistant\",\n \"content\": \"content\",\n \"model\": \"claude-3-sonnet-20240229\",\n \"stop_reason\": \"end_turn\",\n \"stop_sequence\": \"stop_sequence\",\n \"usage\": {\n \"input_tokens\": 1,\n \"output_tokens\": 2\n }\n}"
);
}
#[test]
fn default_message_object_type() {
assert_eq!(
MessageObjectType::default(),
MessageObjectType::Message
);
}
#[test]
fn message_object_type_display() {
assert_eq!(
MessageObjectType::Message.to_string(),
"message"
);
}
#[test]
fn message_object_type_serialize() {
assert_eq!(
serde_json::to_string(&MessageObjectType::Message).unwrap(),
"\"message\""
);
}
#[test]
fn message_object_type_deserialize() {
assert_eq!(
serde_json::from_str::<MessageObjectType>("\"message\"").unwrap(),
MessageObjectType::Message
);
}
#[test]
fn create_message() {
let response = MessagesResponseBody {
content: Content::from("content"),
..Default::default()
};
assert_eq!(
response.crate_message(),
Message::assistant("content")
);
}
}