1use serde::{
2 Deserialize,
3 Serialize,
4};
5use sqlxo_traits::{
6 WebLeaf,
7 WebQueryModel,
8 WebSortField,
9};
10use utoipa::{
11 IntoParams,
12 ToSchema,
13};
14
15mod builder;
16mod page;
17pub use page::{
18 WebPage,
19 WebPagination,
20};
21
22#[derive(Clone, Serialize, Deserialize, ToSchema, Debug, IntoParams)]
23#[serde(bound(deserialize = "Q: WebLeaf + Deserialize<'de>, S: \
24 WebSortField + Deserialize<'de>"))]
25#[into_params(parameter_in = Query)]
26pub struct GenericWebFilter<Q, S>
27where
28 Q: WebLeaf + Serialize,
29 S: WebSortField + Serialize,
30{
31 #[schema(no_recursion, nullable)]
32 pub filter: Option<GenericWebExpression<Q>>,
33 #[schema(no_recursion, nullable)]
34 pub sort: Option<Vec<GenericWebSort<S>>>,
35 #[schema(nullable)]
36 pub page: Option<WebPagination>,
37}
38
39#[derive(Clone, Serialize, Deserialize, ToSchema, Debug)]
40#[serde(bound(deserialize = "Q: WebLeaf + Deserialize<'de>"))]
41#[serde(untagged)]
42pub enum GenericWebExpression<Q>
43where
44 Q: WebLeaf + Serialize,
45{
46 #[schema(no_recursion)]
47 And {
48 and: Vec<GenericWebExpression<Q>>,
49 },
50 #[schema(no_recursion)]
51 Or {
52 or: Vec<GenericWebExpression<Q>>,
53 },
54 Leaf(Q),
55}
56
57#[derive(Clone, Serialize, Deserialize, ToSchema, Debug)]
58#[serde(bound(deserialize = "S: WebSortField + Deserialize<'de>"))]
59#[serde(transparent)]
60pub struct GenericWebSort<S>(pub S)
61where
62 S: WebSortField + Serialize;
63
64pub type WebExpression<T> = GenericWebExpression<<T as WebQueryModel>::Leaf>;
65pub type WebSort<T> = GenericWebSort<<T as WebQueryModel>::SortField>;
66pub type WebFilter<T> = GenericWebFilter<
67 <T as WebQueryModel>::Leaf,
68 <T as WebQueryModel>::SortField,
69>;