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    pub fn new(mode: SaveMode) -> Self {
36        Self {
37            mode,
38            ..Default::default()
39        }
40    }
41
42    // from
43    pub fn from<E: EntityKind>(mut self, input: impl Into<E>) -> Result<Self, Error> {
44        let entity = input.into();
45        self.bytes = serialize(&entity)?;
46
47        Ok(self)
48    }
49
50    // from_bytes
51    #[must_use]
52    pub fn from_bytes(mut self, bytes: &[u8]) -> Self {
53        self.bytes = bytes.to_vec();
54        self
55    }
56
57    // from_entity
58    pub fn from_entity<E: EntityKind>(mut self, entity: E) -> Result<Self, Error> {
59        self.bytes = serialize(&entity)?;
60
61        Ok(self)
62    }
63}