icydb_core/db/query/
mod.rs1mod delete;
2mod load;
3mod planner;
4mod save;
5
6pub use delete::*;
7pub use load::*;
8pub use planner::*;
9pub use save::*;
10
11pub 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#[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
64pub 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#[must_use]
80pub fn load() -> LoadQuery {
82 LoadQuery::new()
83}
84
85#[must_use]
87pub fn delete() -> DeleteQuery {
89 DeleteQuery::new()
90}
91
92#[must_use]
94pub fn insert() -> SaveQuery {
96 SaveQuery::new(SaveMode::Insert)
97}
98
99#[must_use]
101pub fn update() -> SaveQuery {
103 SaveQuery::new(SaveMode::Update)
104}
105
106#[must_use]
108pub fn replace() -> SaveQuery {
110 SaveQuery::new(SaveMode::Replace)
111}