Skip to main content

sqlxo_traits/
web.rs

1use crate::QueryContext;
2use serde::{
3	Deserialize,
4	Serialize,
5};
6use utoipa::{
7	PartialSchema,
8	ToSchema,
9};
10
11pub trait WebLeaf:
12	Clone + Send + Sync + Serialize + ToSchema + PartialSchema
13{
14}
15
16impl<T> WebLeaf for T where
17	T: Clone
18		+ Send
19		+ Sync
20		+ Serialize
21		+ for<'de> Deserialize<'de>
22		+ ToSchema
23		+ PartialSchema
24{
25}
26
27pub trait WebSortField:
28	Clone + Send + Sync + Serialize + ToSchema + PartialSchema
29{
30}
31impl<T> WebSortField for T where
32	T: Clone
33		+ Serialize
34		+ for<'de> Deserialize<'de>
35		+ ToSchema
36		+ PartialSchema
37		+ Send
38		+ Sync
39{
40}
41
42pub trait WebJoinPayload:
43	Clone + Send + Sync + Serialize + ToSchema + PartialSchema
44{
45	fn flatten(&self, prefix: &mut Vec<String>, out: &mut Vec<Vec<String>>);
46}
47
48pub trait WebQueryModel {
49	type Leaf: WebLeaf;
50	type SortField: WebSortField;
51	type AggregateLeaf: WebLeaf;
52	type JoinPath: WebJoinPayload + for<'de> Deserialize<'de>;
53}
54
55pub trait Bind<C>: WebQueryModel
56where
57	C: QueryContext,
58{
59	fn map_leaf(leaf: &<Self as WebQueryModel>::Leaf) -> C::Query;
60
61	fn map_sort_field(sort: &<Self as WebQueryModel>::SortField) -> C::Sort;
62}
63
64#[derive(Clone, Copy, Serialize, Deserialize, ToSchema, Debug)]
65#[serde(rename_all = "lowercase")]
66pub enum WebSortDirection {
67	Asc,
68	Desc,
69}