distx_core/
point.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3use crate::vector::Vector;
4
5/// A point in the vector space with optional payload
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Point {
8    pub id: PointId,
9    pub vector: Vector,
10    pub payload: Option<serde_json::Value>,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
14#[serde(untagged)]
15pub enum PointId {
16    String(String),
17    Uuid(Uuid),
18    Integer(u64),
19}
20
21impl std::fmt::Display for PointId {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        match self {
24            PointId::String(s) => write!(f, "{}", s),
25            PointId::Uuid(u) => write!(f, "{}", u),
26            PointId::Integer(i) => write!(f, "{}", i),
27        }
28    }
29}
30
31impl From<String> for PointId {
32    fn from(s: String) -> Self {
33        PointId::String(s)
34    }
35}
36
37impl From<u64> for PointId {
38    fn from(i: u64) -> Self {
39        PointId::Integer(i)
40    }
41}
42
43impl From<Uuid> for PointId {
44    fn from(u: Uuid) -> Self {
45        PointId::Uuid(u)
46    }
47}
48
49impl Point {
50    #[inline]
51    #[must_use]
52    pub fn new(id: PointId, vector: Vector, payload: Option<serde_json::Value>) -> Self {
53        Self {
54            id,
55            vector,
56            payload,
57        }
58    }
59
60    #[inline]
61    #[must_use]
62    pub fn with_payload(mut self, payload: serde_json::Value) -> Self {
63        self.payload = Some(payload);
64        self
65    }
66}
67