use crate::{error::StorageError, shared::Message};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Transcript {
pub session_id: String,
pub messages: Vec<Message>,
}
impl Transcript {
pub fn new(session_id: &str) -> Self {
Self {
session_id: String::from(session_id),
messages: Vec::new(),
}
}
pub fn append(&mut self, message: Message) {
self.messages.push(message);
}
}
#[async_trait]
pub trait TranscriptStorage: Send + Sync {
async fn save_transcript(
&self,
session_id: &str,
transcript: &Transcript,
) -> Result<(), StorageError>;
async fn get_transcript(&self, session_id: &str) -> Result<Option<Transcript>, StorageError>;
async fn append_message(&self, session_id: &str, message: Message) -> Result<(), StorageError> {
self.append_messages(session_id, vec![message]).await
}
async fn append_messages(
&self,
session_id: &str,
messages: Vec<Message>,
) -> Result<(), StorageError> {
let mut transcript = self
.get_transcript(session_id)
.await?
.unwrap_or_else(|| Transcript::new(session_id));
for message in messages {
transcript.append(message);
}
self.save_transcript(session_id, &transcript).await
}
async fn delete_transcript(&self, session_id: &str) -> Result<(), StorageError>;
}