rig_core/embeddings/
embed.rs1#[derive(Debug, thiserror::Error)]
15#[error("{0}")]
16pub struct EmbedError(#[from] Box<dyn std::error::Error + Send + Sync>);
17
18impl EmbedError {
19 pub fn new<E: std::error::Error + Send + Sync + 'static>(error: E) -> Self {
20 EmbedError(Box::new(error))
21 }
22}
23
24pub trait Embed {
66 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError>;
68}
69
70#[derive(Default)]
73pub struct TextEmbedder {
74 pub(crate) texts: Vec<String>,
75}
76
77impl TextEmbedder {
78 pub fn embed(&mut self, text: String) {
80 self.texts.push(text);
81 }
82}
83
84pub fn to_texts(item: impl Embed) -> Result<Vec<String>, EmbedError> {
87 let mut embedder = TextEmbedder::default();
88 item.embed(&mut embedder)?;
89 Ok(embedder.texts)
90}
91
92impl Embed for String {
97 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
98 embedder.embed(self.clone());
99 Ok(())
100 }
101}
102
103impl Embed for &str {
104 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
105 embedder.embed(self.to_string());
106 Ok(())
107 }
108}
109
110impl Embed for i8 {
111 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
112 embedder.embed(self.to_string());
113 Ok(())
114 }
115}
116
117impl Embed for i16 {
118 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
119 embedder.embed(self.to_string());
120 Ok(())
121 }
122}
123
124impl Embed for i32 {
125 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
126 embedder.embed(self.to_string());
127 Ok(())
128 }
129}
130
131impl Embed for i64 {
132 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
133 embedder.embed(self.to_string());
134 Ok(())
135 }
136}
137
138impl Embed for i128 {
139 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
140 embedder.embed(self.to_string());
141 Ok(())
142 }
143}
144
145impl Embed for f32 {
146 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
147 embedder.embed(self.to_string());
148 Ok(())
149 }
150}
151
152impl Embed for f64 {
153 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
154 embedder.embed(self.to_string());
155 Ok(())
156 }
157}
158
159impl Embed for bool {
160 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
161 embedder.embed(self.to_string());
162 Ok(())
163 }
164}
165
166impl Embed for char {
167 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
168 embedder.embed(self.to_string());
169 Ok(())
170 }
171}
172
173impl Embed for serde_json::Value {
174 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
175 embedder.embed(serde_json::to_string(self).map_err(EmbedError::new)?);
176 Ok(())
177 }
178}
179
180impl<T: Embed> Embed for &T {
181 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
182 (*self).embed(embedder)
183 }
184}
185
186impl<T: Embed> Embed for Vec<T> {
187 fn embed(&self, embedder: &mut TextEmbedder) -> Result<(), EmbedError> {
188 for item in self {
189 item.embed(embedder).map_err(EmbedError::new)?;
190 }
191 Ok(())
192 }
193}