Skip to main content

ruve/
types.rs

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}