sqlxo/web/
mod.rs

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>;