use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::error::ToolError;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetrievalResult {
pub content: String,
pub source: String,
pub score: f64,
#[serde(default)]
pub metadata: serde_json::Value,
}
#[async_trait]
pub trait BaseRetrievalTool: Send + Sync {
fn name(&self) -> &str;
async fn retrieve(&self, query: &str, top_k: usize) -> Result<Vec<RetrievalResult>, ToolError>;
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_object_safe(_: &dyn BaseRetrievalTool) {}
#[test]
fn retrieval_result_serde() {
let result = RetrievalResult {
content: "Test content".into(),
source: "doc.txt".into(),
score: 0.95,
metadata: serde_json::json!({"page": 1}),
};
let json = serde_json::to_string(&result).unwrap();
let deserialized: RetrievalResult = serde_json::from_str(&json).unwrap();
assert!((deserialized.score - 0.95).abs() < f64::EPSILON);
}
}