icydb_core/db/query/
delete.rs

1use crate::{
2    db::{
3        primitives::{FilterExpr, FilterExt, FilterSlot, LimitExpr, LimitSlot},
4        query::{QueryError, QueryValidate},
5    },
6    traits::{EntityKind, FieldValue},
7};
8use candid::CandidType;
9use serde::Deserialize;
10use serde::Serialize;
11
12///
13/// DeleteQuery
14///
15
16#[derive(CandidType, Clone, Debug, Default, Deserialize, Serialize)]
17pub struct DeleteQuery {
18    pub filter: Option<FilterExpr>,
19    pub limit: Option<LimitExpr>,
20}
21
22impl DeleteQuery {
23    #[must_use]
24    pub fn new() -> Self {
25        Self::default()
26    }
27
28    #[must_use]
29    pub fn one<E: EntityKind>(self, value: impl FieldValue) -> Self {
30        self.filter(|f| f.eq(E::PRIMARY_KEY, value))
31    }
32
33    #[must_use]
34    pub fn only<E: EntityKind>(self) -> Self {
35        self.filter(|f| f.eq(E::PRIMARY_KEY, ()))
36    }
37
38    #[must_use]
39    pub fn many<E: EntityKind>(self, values: impl IntoIterator<Item = impl FieldValue>) -> Self {
40        self.filter(move |f| f.in_iter(E::PRIMARY_KEY, values))
41    }
42}
43
44impl FilterSlot for DeleteQuery {
45    fn filter_slot(&mut self) -> &mut Option<FilterExpr> {
46        &mut self.filter
47    }
48}
49
50impl LimitSlot for DeleteQuery {
51    fn limit_slot(&mut self) -> &mut Option<LimitExpr> {
52        &mut self.limit
53    }
54}
55
56impl<E: EntityKind> QueryValidate<E> for DeleteQuery {
57    fn validate(&self) -> Result<(), QueryError> {
58        if let Some(filter) = &self.filter {
59            QueryValidate::<E>::validate(filter)?;
60        }
61
62        if let Some(limit) = &self.limit {
63            QueryValidate::<E>::validate(limit)?;
64        }
65
66        Ok(())
67    }
68}