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}