use async_trait::async_trait;
use crate::id::SessionId;
use crate::message::Message;
#[async_trait]
pub trait ContextAssembler: Send + Sync {
async fn assemble(&self, session_id: SessionId, messages: &[Message]) -> Vec<Message>;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct PassthroughContextAssembler;
#[async_trait]
impl ContextAssembler for PassthroughContextAssembler {
async fn assemble(&self, _session_id: SessionId, messages: &[Message]) -> Vec<Message> {
messages.to_vec()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn passthrough_returns_history_unchanged() {
let messages = vec![Message::user("hi"), Message::assistant("hello")];
let assembler = PassthroughContextAssembler;
use std::pin::pin;
use std::task::{Context, Poll, Waker};
let future = assembler.assemble(SessionId::new(), &messages);
let mut future = pin!(future);
let waker = Waker::noop();
let mut cx = Context::from_waker(waker);
let result = loop {
if let Poll::Ready(output) = future.as_mut().poll(&mut cx) {
break output;
}
};
assert_eq!(result, messages);
}
}