use anyhow::Result;
pub trait EmbeddingProvider: Send + Sync {
fn embed(&self, text: &str) -> Result<Vec<f32>>;
fn embed_batch(&self, texts: &[String]) -> Result<Vec<Vec<f32>>> {
texts.iter().map(|t| self.embed(t)).collect()
}
fn dimension(&self) -> usize;
fn model_name(&self) -> &str;
}
#[cfg(test)]
mod tests {
use super::*;
struct MockEmbedding;
impl EmbeddingProvider for MockEmbedding {
fn embed(&self, _text: &str) -> Result<Vec<f32>> {
Ok(vec![0.1, 0.2, 0.3])
}
fn dimension(&self) -> usize {
3
}
fn model_name(&self) -> &str {
"mock-model"
}
}
#[test]
fn test_embed_single() {
let provider = MockEmbedding;
let embedding = provider.embed("test").unwrap();
assert_eq!(embedding.len(), 3);
}
#[test]
fn test_embed_batch_default() {
let provider = MockEmbedding;
let texts = vec!["a".to_string(), "b".to_string()];
let embeddings = provider.embed_batch(&texts).unwrap();
assert_eq!(embeddings.len(), 2);
}
#[test]
fn test_dimension() {
let provider = MockEmbedding;
assert_eq!(provider.dimension(), 3);
}
#[test]
fn test_model_name() {
let provider = MockEmbedding;
assert_eq!(provider.model_name(), "mock-model");
}
}