use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MessageKind {
Task,
Reply,
Question,
Status,
Artifact,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Part {
Text {
text: String,
},
Data {
data: serde_json::Value,
},
File {
uri: String,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MsgState {
Unread,
Delivered,
Consumed,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Message {
pub id: Uuid,
pub team_id: String,
pub task_id: Option<Uuid>,
pub from: String,
pub to: String,
pub kind: MessageKind,
pub parts: Vec<Part>,
pub in_reply_to: Option<Uuid>,
pub state: MsgState,
pub created_at: DateTime<Utc>,
pub consumed_at: Option<DateTime<Utc>>,
}
impl Message {
pub fn new(
team_id: impl Into<String>,
from: impl Into<String>,
to: impl Into<String>,
kind: MessageKind,
parts: Vec<Part>,
) -> Self {
Message {
id: Uuid::new_v4(),
team_id: team_id.into(),
task_id: None,
from: from.into(),
to: to.into(),
kind,
parts,
in_reply_to: None,
state: MsgState::Unread,
created_at: Utc::now(),
consumed_at: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Artifact {
pub kind: String,
pub content: String,
pub name: Option<String>,
}