icydb_core/db/query/
delete.rs1use 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#[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}