rig_core/embeddings/
embed.rs1#[derive(Debug, thiserror::Error)]
12#[error("{0}")]
13pub struct EmbedError(#[from] Box<dyn std::error::Error + Send + Sync>);
14
15impl EmbedError {
16 pub fn new<E: std::error::Error + Send + Sync + 'static>(error: E) -> Self {
17 EmbedError(Box::new(error))
18 }
19}
20
21pub trait Embed {
40 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError>;
42}
43
44#[derive(Default)]
47pub struct TextEmbedder {
48 pub(crate) texts: Vec<String>,
49}
50
51impl TextEmbedder {
52 pub fn embed(&mut self, text: String) {
54 self.texts.push(text);
55 }
56}
57
58pub fn to_texts(item: impl Embed) -> Result<Vec<String>, EmbedError> {
60 let mut embedder = TextEmbedder::default();
61 item.embed(&mut embedder)?;
62 Ok(embedder.texts)
63}
64
65impl Embed for String {
66 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
67 embedder.embed(self.clone());
68 Ok(())
69 }
70}
71
72macro_rules! embed_as_text {
74 ($($type:ty),*) => {$(
75 impl Embed for $type {
76 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
77 embedder.embed(self.to_string());
78 Ok(())
79 }
80 }
81 )*};
82}
83
84embed_as_text!(&str, i8, i16, i32, i64, i128, f32, f64, bool, char);
85
86impl Embed for serde_json::Value {
87 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
88 embedder.embed(serde_json::to_string(self).map_err(EmbedError::new)?);
89 Ok(())
90 }
91}
92
93impl<T: Embed> Embed for &T {
94 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
95 (*self).embed(embedder)
96 }
97}
98
99impl<T: Embed> Embed for Vec<T> {
100 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
101 for item in self {
102 item.embed(embedder).map_err(EmbedError::new)?;
103 }
104 Ok(())
105 }
106}