use std::any::Any;
use async_trait::async_trait;
use crate::embedding::embedder::{EmbedInput, EmbedInputType, Embedder};
use crate::error::{LaurusError, Result};
use crate::vector::core::vector::Vector;
#[derive(Debug, Clone, Default)]
pub struct PrecomputedEmbedder;
impl PrecomputedEmbedder {
pub fn new() -> Self {
Self
}
}
#[async_trait]
impl Embedder for PrecomputedEmbedder {
async fn embed(&self, _input: &EmbedInput<'_>) -> Result<Vector> {
Err(LaurusError::invalid_argument(
"PrecomputedEmbedder does not support embedding - use pre-computed vectors",
))
}
fn supported_input_types(&self) -> Vec<EmbedInputType> {
vec![]
}
fn supports_text(&self) -> bool {
false
}
fn supports_image(&self) -> bool {
false
}
fn name(&self) -> &str {
"PrecomputedEmbedder"
}
fn as_any(&self) -> &dyn Any {
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Arc;
#[test]
fn test_new() {
let embedder = PrecomputedEmbedder::new();
assert!(!embedder.supports_text());
assert!(!embedder.supports_image());
}
#[test]
fn test_supports_text() {
let embedder = PrecomputedEmbedder::new();
assert!(!embedder.supports_text());
}
#[test]
fn test_supports_image() {
let embedder = PrecomputedEmbedder::new();
assert!(!embedder.supports_image());
}
#[test]
fn test_supported_input_types() {
let embedder = PrecomputedEmbedder::new();
assert!(embedder.supported_input_types().is_empty());
}
#[test]
fn test_is_multimodal() {
let embedder = PrecomputedEmbedder::new();
assert!(!embedder.is_multimodal());
}
#[tokio::test]
async fn test_embed_returns_error() {
let embedder = PrecomputedEmbedder::new();
let result = embedder.embed(&EmbedInput::Text("hello")).await;
assert!(result.is_err());
let result = embedder.embed(&EmbedInput::Bytes(&[], None)).await;
assert!(result.is_err());
}
#[test]
fn test_as_any() {
let embedder = PrecomputedEmbedder::new();
let any = embedder.as_any();
assert!(any.downcast_ref::<PrecomputedEmbedder>().is_some());
}
#[test]
fn test_clone() {
let embedder1 = PrecomputedEmbedder::new();
let embedder2 = embedder1.clone();
assert!(!embedder2.supports_text());
}
#[test]
fn test_debug() {
let embedder = PrecomputedEmbedder::new();
let debug_str = format!("{:?}", embedder);
assert_eq!(debug_str, "PrecomputedEmbedder");
}
#[test]
fn test_name() {
let embedder = PrecomputedEmbedder::new();
assert_eq!(embedder.name(), "PrecomputedEmbedder");
}
#[test]
fn test_arc_embedder() {
let embedder: Arc<dyn Embedder> = Arc::new(PrecomputedEmbedder::new());
assert!(!embedder.supports_text());
assert!(!embedder.supports_image());
}
}