#[derive(Debug, thiserror::Error)]
#[error("{0}")]
pub struct EmbedError(#[from] Box<dyn std::error::Error + Send + Sync>);
impl EmbedError {
pub fn new<E: std::error::Error + Send + Sync + 'static>(error: E) -> Self {
EmbedError(Box::new(error))
}
}
pub trait Embed {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError>;
}
#[derive(Default)]
pub struct TextEmbedder {
pub(crate) texts: Vec<String>,
}
impl TextEmbedder {
pub fn embed(&mut self, text: String) {
self.texts.push(text);
}
}
pub fn to_texts(item: impl Embed) -> Result<Vec<String>, EmbedError> {
let mut embedder = TextEmbedder::default();
item.embed(&mut embedder)?;
Ok(embedder.texts)
}
impl Embed for String {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
embedder.embed(self.clone());
Ok(())
}
}
macro_rules! embed_as_text {
($($type:ty),*) => {$(
impl Embed for $type {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
embedder.embed(self.to_string());
Ok(())
}
}
)*};
}
embed_as_text!(&str, i8, i16, i32, i64, i128, f32, f64, bool, char);
impl Embed for serde_json::Value {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
embedder.embed(serde_json::to_string(self).map_err(EmbedError::new)?);
Ok(())
}
}
impl<T: Embed> Embed for &T {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
(*self).embed(embedder)
}
}
impl<T: Embed> Embed for Vec<T> {
fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
for item in self {
item.embed(embedder).map_err(EmbedError::new)?;
}
Ok(())
}
}