use std::error::Error;
use serde::Deserialize;
use serde::Serialize;
use serde_json::Value;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum MessageType {
#[serde(rename = "system")]
SystemMessage,
#[serde(rename = "ai")]
AIMessage,
#[serde(rename = "human")]
HumanMessage,
}
impl Default for MessageType {
fn default() -> Self {
Self::SystemMessage
}
}
impl MessageType {
pub fn to_string(&self) -> String {
match self {
MessageType::SystemMessage => "system".to_owned(),
MessageType::AIMessage => "ai".to_owned(),
MessageType::HumanMessage => "human".to_owned(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
pub struct Message {
pub content: String,
pub message_type: MessageType,
}
impl Message {
pub fn new_human_message<T: std::fmt::Display>(content: T) -> Self {
Message {
content: content.to_string(),
message_type: MessageType::HumanMessage,
}
}
pub fn new_system_message<T: std::fmt::Display>(content: T) -> Self {
Message {
content: content.to_string(),
message_type: MessageType::SystemMessage,
}
}
pub fn new_ai_message<T: std::fmt::Display>(content: T) -> Self {
Message {
content: content.to_string(),
message_type: MessageType::AIMessage,
}
}
pub fn messages_from_value(value: &Value) -> Result<Vec<Message>, Box<dyn Error>> {
serde_json::from_value(value.clone()).map_err(|e| e.into())
}
}