everruns_core/
message_retriever.rs1use async_trait::async_trait;
8
9use crate::error::Result;
10use crate::message::{ContentPart, Controls, Message, MessageRole};
11use crate::message_filter::MessageQuery;
12use crate::typed_id::{MessageId, SessionId};
13
14#[derive(Debug, Clone)]
15pub struct MessageHistory {
16 pub messages: Vec<Message>,
17 pub source_sequence: Option<i64>,
19}
20
21#[derive(Debug, Clone)]
33pub struct InputMessage {
34 pub role: MessageRole,
36 pub content: Vec<ContentPart>,
38 pub controls: Option<Controls>,
40 pub metadata: Option<std::collections::HashMap<String, serde_json::Value>>,
42 pub tags: Vec<String>,
44}
45
46impl InputMessage {
47 pub fn user(content: impl Into<String>) -> Self {
49 Self {
50 role: MessageRole::User,
51 content: vec![ContentPart::text(content)],
52 controls: None,
53 metadata: None,
54 tags: vec![],
55 }
56 }
57
58 pub fn from_message(msg: &Message) -> Self {
60 Self {
61 role: msg.role.clone(),
62 content: msg.content.clone(),
63 controls: msg.controls.clone(),
64 metadata: msg.metadata.clone(),
65 tags: vec![],
66 }
67 }
68}
69
70impl From<&str> for InputMessage {
71 fn from(text: &str) -> Self {
72 InputMessage::user(text)
73 }
74}
75
76impl From<String> for InputMessage {
77 fn from(text: String) -> Self {
78 InputMessage::user(text)
79 }
80}
81
82#[async_trait]
97pub trait MessageRetriever: Send + Sync {
98 async fn get(&self, session_id: SessionId, message_id: MessageId) -> Result<Option<Message>>;
100
101 async fn load(&self, session_id: SessionId) -> Result<Vec<Message>>;
103
104 async fn load_filtered(&self, query: MessageQuery) -> Result<Vec<Message>> {
113 self.load(query.session_id).await
116 }
117
118 async fn load_filtered_history(&self, query: MessageQuery) -> Result<MessageHistory> {
119 Ok(MessageHistory {
120 messages: self.load_filtered(query).await?,
121 source_sequence: None,
122 })
123 }
124
125 async fn load_page(
127 &self,
128 session_id: SessionId,
129 offset: usize,
130 limit: usize,
131 ) -> Result<Vec<Message>> {
132 let all = self.load(session_id).await?;
133 Ok(all.into_iter().skip(offset).take(limit).collect())
134 }
135
136 async fn count(&self, session_id: SessionId) -> Result<usize> {
138 Ok(self.load(session_id).await?.len())
139 }
140}
141
142#[async_trait]
143impl<T: MessageRetriever + ?Sized> MessageRetriever for std::sync::Arc<T> {
144 async fn get(&self, session_id: SessionId, message_id: MessageId) -> Result<Option<Message>> {
145 (**self).get(session_id, message_id).await
146 }
147
148 async fn load(&self, session_id: SessionId) -> Result<Vec<Message>> {
149 (**self).load(session_id).await
150 }
151
152 async fn load_filtered(&self, query: MessageQuery) -> Result<Vec<Message>> {
153 (**self).load_filtered(query).await
154 }
155
156 async fn load_filtered_history(&self, query: MessageQuery) -> Result<MessageHistory> {
157 (**self).load_filtered_history(query).await
158 }
159
160 async fn load_page(
161 &self,
162 session_id: SessionId,
163 offset: usize,
164 limit: usize,
165 ) -> Result<Vec<Message>> {
166 (**self).load_page(session_id, offset, limit).await
167 }
168
169 async fn count(&self, session_id: SessionId) -> Result<usize> {
170 (**self).count(session_id).await
171 }
172}