icydb_core/db/query/
mod.rs

1mod delete;
2mod load;
3mod planner;
4mod save;
5
6pub use delete::*;
7pub use load::*;
8pub use planner::*;
9pub use save::*;
10
11///
12/// Query Prelude
13///
14
15pub mod prelude {
16    pub use crate::db::{
17        primitives::{
18            filter::{FilterDsl, FilterExt as _},
19            limit::LimitExt as _,
20            sort::SortExt as _,
21        },
22        query,
23    };
24}
25
26use crate::{
27    ThisError,
28    runtime_error::{ErrorClass, ErrorOrigin, RuntimeError},
29    traits::EntityKind,
30};
31
32///
33/// QueryError
34///
35
36#[derive(Debug, ThisError)]
37pub enum QueryError {
38    #[error("invalid filter field '{0}'")]
39    InvalidFilterField(String),
40
41    #[error("invalid filter value: {0}")]
42    InvalidFilterValue(String),
43
44    #[error("invalid sort field '{0}'")]
45    InvalidSortField(String),
46}
47
48impl QueryError {
49    pub(crate) const fn class(&self) -> ErrorClass {
50        match self {
51            Self::InvalidFilterField(_)
52            | Self::InvalidFilterValue(_)
53            | Self::InvalidSortField(_) => ErrorClass::Unsupported,
54        }
55    }
56}
57
58impl From<QueryError> for RuntimeError {
59    fn from(err: QueryError) -> Self {
60        Self::new(err.class(), ErrorOrigin::Query, err.to_string())
61    }
62}
63
64///
65/// QueryValidate Trait
66///
67
68pub trait QueryValidate<E: EntityKind> {
69    fn validate(&self) -> Result<(), QueryError>;
70}
71
72impl<E: EntityKind, T: QueryValidate<E>> QueryValidate<E> for Box<T> {
73    fn validate(&self) -> Result<(), QueryError> {
74        (**self).validate()
75    }
76}
77
78// load
79#[must_use]
80/// Start building a `LoadQuery`.
81pub fn load() -> LoadQuery {
82    LoadQuery::new()
83}
84
85// delete
86#[must_use]
87/// Start building a `DeleteQuery`.
88pub fn delete() -> DeleteQuery {
89    DeleteQuery::new()
90}
91
92// create
93#[must_use]
94/// Build an insert `SaveQuery`.
95pub fn insert() -> SaveQuery {
96    SaveQuery::new(SaveMode::Insert)
97}
98
99// update
100#[must_use]
101/// Build an update `SaveQuery`.
102pub fn update() -> SaveQuery {
103    SaveQuery::new(SaveMode::Update)
104}
105
106// replace
107#[must_use]
108/// Build a replace `SaveQuery`.
109pub fn replace() -> SaveQuery {
110    SaveQuery::new(SaveMode::Replace)
111}