1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct Record {
6 pub id: String,
7 pub vector: Vec<f32>,
8 pub metadata: Option<String>,
9}
10
11impl Record {
12 pub fn new(vector: Vec<f32>, metadata: Option<String>, id: Option<String>) -> Self {
13 Record {
14 id: match id {
15 Some(id) => id,
16 _ => Uuid::now_v7().to_string()
17 },
18 vector,
19 metadata
20 }
21 }
22}
23
24#[cfg(test)]
25mod tests {
26 use super::*;
27
28 #[test]
29 fn auto_generates_uuid_when_no_id_given() {
30 let r = Record::new(vec![1.0], None, None);
31 assert!(!r.id.is_empty());
32 }
33
34 #[test]
35 fn uses_custom_id_when_provided() {
36 let r = Record::new(vec![1.0], None, Some("my-key".to_string()));
37 assert_eq!(r.id, "my-key");
38 }
39
40 #[test]
41 fn two_auto_generated_ids_are_distinct() {
42 let r1 = Record::new(vec![1.0], None, None);
43 let r2 = Record::new(vec![1.0], None, None);
44 assert_ne!(r1.id, r2.id);
45 }
46
47 #[test]
48 fn metadata_and_vector_are_stored() {
49 let r = Record::new(vec![1.0, 2.0], Some("hello".to_string()), None);
50 assert_eq!(r.vector, vec![1.0, 2.0]);
51 assert_eq!(r.metadata.as_deref(), Some("hello"));
52 }
53}