use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Serialize, Deserialize)]
pub struct Record {
pub id: String,
pub vector: Vec<f32>,
pub metadata: Option<String>,
}
impl Record {
pub fn new(vector: Vec<f32>, metadata: Option<String>, id: Option<String>) -> Self {
Record {
id: match id {
Some(id) => id,
_ => Uuid::now_v7().to_string()
},
vector,
metadata
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn auto_generates_uuid_when_no_id_given() {
let r = Record::new(vec![1.0], None, None);
assert!(!r.id.is_empty());
}
#[test]
fn uses_custom_id_when_provided() {
let r = Record::new(vec![1.0], None, Some("my-key".to_string()));
assert_eq!(r.id, "my-key");
}
#[test]
fn two_auto_generated_ids_are_distinct() {
let r1 = Record::new(vec![1.0], None, None);
let r2 = Record::new(vec![1.0], None, None);
assert_ne!(r1.id, r2.id);
}
#[test]
fn metadata_and_vector_are_stored() {
let r = Record::new(vec![1.0, 2.0], Some("hello".to_string()), None);
assert_eq!(r.vector, vec![1.0, 2.0]);
assert_eq!(r.metadata.as_deref(), Some("hello"));
}
}