use std::collections::HashMap;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::types::SessionId;
#[derive(Debug, Clone)]
pub struct TransformContext {
pub session_id: SessionId,
}
#[async_trait]
pub trait SystemMessageTransform: Send + Sync + 'static {
fn section_ids(&self) -> Vec<String>;
async fn transform_section(
&self,
section_id: &str,
content: &str,
ctx: TransformContext,
) -> Option<String>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct TransformSection {
pub(crate) content: String,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct TransformResponse {
pub(crate) sections: HashMap<String, TransformSection>,
}
pub(crate) async fn dispatch_transform(
transform: &dyn SystemMessageTransform,
session_id: &SessionId,
sections: HashMap<String, TransformSection>,
) -> TransformResponse {
let ctx = TransformContext {
session_id: session_id.clone(),
};
let mut result = HashMap::with_capacity(sections.len());
for (section_id, data) in sections {
let content = match transform
.transform_section(§ion_id, &data.content, ctx.clone())
.await
{
Some(transformed) => transformed,
None => data.content,
};
result.insert(section_id, TransformSection { content });
}
TransformResponse { sections: result }
}
#[cfg(test)]
mod tests;