icydb_core/db/query/
save.rs

1use crate::{Error, serialize, traits::EntityKind};
2use candid::CandidType;
3use derive_more::Display;
4use serde::{Deserialize, Serialize};
5
6///
7/// SaveMode
8///
9/// Create  : will only insert a row if it's empty
10/// Replace : will change the row regardless of what was there
11/// Update  : will only change an existing row
12///
13
14#[derive(CandidType, Clone, Copy, Debug, Default, Deserialize, Display, Serialize)]
15pub enum SaveMode {
16    #[default]
17    Insert,
18    Replace,
19    Update,
20    //    Upsert,
21}
22
23///
24/// SaveQuery
25///
26
27#[derive(CandidType, Clone, Debug, Default, Deserialize, Serialize)]
28pub struct SaveQuery {
29    pub mode: SaveMode,
30    pub bytes: Vec<u8>,
31}
32
33impl SaveQuery {
34    #[must_use]
35    /// Create a new save query for the given mode.
36    pub fn new(mode: SaveMode) -> Self {
37        Self {
38            mode,
39            ..Default::default()
40        }
41    }
42
43    // from
44    /// Serialize an entity into the query payload.
45    pub fn from<E: EntityKind>(mut self, input: impl Into<E>) -> Result<Self, Error> {
46        let entity = input.into();
47        self.bytes = serialize(&entity)?;
48
49        Ok(self)
50    }
51
52    // from_bytes
53    #[must_use]
54    /// Use an already-serialized entity payload.
55    pub fn from_bytes(mut self, bytes: &[u8]) -> Self {
56        self.bytes = bytes.to_vec();
57        self
58    }
59
60    // from_entity
61    /// Serialize the provided entity into the query payload.
62    pub fn from_entity<E: EntityKind>(mut self, entity: E) -> Result<Self, Error> {
63        self.bytes = serialize(&entity)?;
64
65        Ok(self)
66    }
67}