pub enum RawToolEvent {
Content {
data: Vec<u8>,
mime_type: Option<String>,
metadata: Vec<(String, Vec<u8>)>,
},
Error {
kind: String,
message: String,
default_language: String,
},
}
pub struct ActContext<C = ()> {
metadata: C,
events: Vec<RawToolEvent>,
}
impl<C> ActContext<C> {
#[doc(hidden)]
pub fn __new(metadata: C) -> Self {
Self {
metadata,
events: Vec::new(),
}
}
pub fn metadata(&self) -> &C {
&self.metadata
}
pub fn send_text(&mut self, text: impl Into<String>) {
self.send_content(
text.into().into_bytes(),
Some(crate::constants::MIME_TEXT.to_string()),
vec![],
);
}
pub fn send_cbor<T: serde::Serialize>(&mut self, value: &T) {
let mut buf = Vec::new();
ciborium::into_writer(value, &mut buf).expect("CBOR serialization should not fail");
self.send_content(buf, Some(crate::constants::MIME_CBOR.to_string()), vec![]);
}
pub fn send_json<T: serde::Serialize>(&mut self, value: &T) {
let data = serde_json::to_vec(value).unwrap_or_default();
self.send_content(data, Some(crate::constants::MIME_JSON.to_string()), vec![]);
}
pub fn send_content(
&mut self,
data: Vec<u8>,
mime_type: Option<String>,
metadata: Vec<(String, Vec<u8>)>,
) {
self.events.push(RawToolEvent::Content {
data,
mime_type,
metadata,
});
}
#[doc(hidden)]
pub fn __take_events(&mut self) -> Vec<RawToolEvent> {
std::mem::take(&mut self.events)
}
}