entity_async_graphql/filter/
float.rs

1use async_graphql::InputObject;
2use entity::Predicate;
3use paste::paste;
4
5macro_rules! impl_pred {
6    ($name:ident; $type:ty; $($attrs:tt)*) => {
7        paste! {
8            #[derive(Clone, InputObject)]
9            #[graphql(rename_fields = "snake_case")]
10            #[allow(non_camel_case_types)]
11            pub struct [<GqlPredicate_ $name _RangeArgs>] {
12                start: $type,
13                end: $type,
14            }
15
16            #[derive(Clone, InputObject)]
17            #[graphql(rename_fields = "snake_case")]
18            #[allow(non_camel_case_types)]
19            pub struct [<GqlPredicate_ $name _HasKeyWhereValueArgs>] {
20                key: String,
21                predicate: Box<[<GqlPredicate_ $name>]>,
22            }
23
24            /// Represents a wrapper around an ent query [`TypedPredicate`] that
25            /// exposes a GraphQL API.
26            #[derive(Clone, Default, InputObject)]
27            #[graphql(rename_fields = "snake_case")]
28            #[allow(non_camel_case_types)]
29            pub struct [<GqlPredicate_ $name>] {
30                #[doc = "Checks if multiple predicates pass"] and: Option<Vec<Self>>,
31                #[doc = "Checks if any predicate passes"] or: Option<Vec<Self>>,
32                #[doc = "Checks if exactly one predicate passes"] xor: Option<Vec<Self>>,
33                #[doc = "Checks if any value in collection passes predicate"] any: Option<Box<Self>>,
34                #[doc = "Checks if collection contains value"] contains: Option<$type>,
35                #[doc = "Checks if collection contains all values"] contains_all: Option<Vec<$type>>,
36                #[doc = "Checks if collection contains any of the values"] contains_any: Option<Vec<$type>>,
37                #[doc = "Checks if equals value"] equals: Option<$type>,
38                #[doc = "Checks if greater than value"] greater_than: Option<$type>,
39                #[doc = "Checks if greater than or equals value"] greater_than_or_equals: Option<$type>,
40                #[doc = "Checks if collection contains key"] has_key: Option<String>,
41                #[doc = "Checks if collection has key where associated value passes predicate"] has_key_where_value: Option<[<GqlPredicate_ $name _HasKeyWhereValueArgs>]>,
42                #[doc = "Checks if value in range"] in_range: Option<[<GqlPredicate_ $name _RangeArgs>]>,
43                #[doc = "Checks if value is null"] is_none: Option<bool>,
44                #[doc = "Checks if less than value"] less_than: Option<$type>,
45                #[doc = "Checks if less than or equals value"] less_than_or_equals: Option<$type>,
46                #[doc = "Checks if does not pass predicate"] not: Option<Box<Self>>,
47                #[doc = "Checks if does not equal value"] not_equals: Option<$type>,
48                #[doc = "Checks if value not in range"] not_in_range: Option<[<GqlPredicate_ $name _RangeArgs>]>,
49            }
50
51            impl From<Box<[<GqlPredicate_ $name>]>> for Predicate {
52                fn from(x: Box<[<GqlPredicate_ $name>]>) -> Self {
53                    Self::from(x.as_ref().clone())
54                }
55            }
56
57            impl From<[<GqlPredicate_ $name>]> for Predicate {
58                /// Converts into a predicate based on criteria in GraphQL
59                /// predicate
60                fn from(x: [<GqlPredicate_ $name>]) -> Self {
61                    let mut criteria = Vec::new();
62
63                    impl_pred!(@criteria x; criteria; $name; $type; $($attrs)*);
64
65                    Self::and(criteria)
66                }
67            }
68        }
69    };
70    (@criteria $self:ident; $vec:ident; $name:ident; $type:ty; @core $($tail:tt)*) => {
71        paste! {
72            impl_pred!(@criteria_push $self; $vec; and; |v| Self::and(v));
73            impl_pred!(@criteria_push $self; $vec; or; |v| Self::or(v));
74            impl_pred!(@criteria_push $self; $vec; xor; |v| Self::xor(v));
75            impl_pred!(
76                @criteria_push $self; $vec; any;
77                |v: Box<[<GqlPredicate_ $name>]>| Self::any(v.as_ref().clone())
78            );
79            impl_pred!(@criteria_push $self; $vec; contains; |v| Self::contains(v));
80            impl_pred!(@criteria_push $self; $vec; contains_all; |v| Self::contains_all(v));
81            impl_pred!(@criteria_push $self; $vec; contains_any; |v| Self::contains_any(v));
82            impl_pred!(@criteria_push $self; $vec; equals; |v| Self::equals(v));
83            impl_pred!(@criteria_push $self; $vec; greater_than; |v| Self::greater_than(v));
84            impl_pred!(@criteria_push $self; $vec; greater_than_or_equals; |v| Self::greater_than_or_equals(v));
85            impl_pred!(@criteria_push $self; $vec; has_key; |v| Self::has_key(v));
86            impl_pred!(
87                @criteria_push $self; $vec; has_key_where_value;
88                |v: [<GqlPredicate_ $name _HasKeyWhereValueArgs>]|
89                Self::has_key_where_value(v.key, v.predicate.as_ref().clone())
90            );
91            impl_pred!(
92                @criteria_push $self; $vec; in_range;
93                |v: [<GqlPredicate_ $name _RangeArgs>]| Self::in_range(v.start..=v.end)
94            );
95            impl_pred!(@criteria_push $self; $vec; is_none; |v| if v { Self::IsNone } else { Self::not(Self::IsNone) });
96            impl_pred!(@criteria_push $self; $vec; less_than; |v| Self::less_than(v));
97            impl_pred!(@criteria_push $self; $vec; less_than_or_equals; |v| Self::less_than_or_equals(v));
98            impl_pred!(
99                @criteria_push $self; $vec; not;
100                |v: Box<[<GqlPredicate_ $name>]>| Self::not(v.as_ref().clone())
101            );
102            impl_pred!(@criteria_push $self; $vec; not_equals; |v| Self::not_equals(v));
103            impl_pred!(
104                @criteria_push $self; $vec; not_in_range;
105                |v: [<GqlPredicate_ $name _RangeArgs>]| Self::not_in_range(v.start..=v.end)
106            );
107            impl_pred!(@criteria $self; $vec; $name; $type; $($tail)*);
108        }
109    };
110    (@criteria $self:ident; $vec:ident; $name:ident; $type:ty;) => {};
111    (@criteria_push $self:ident; $vec:ident; $name:ident; $make_pred:expr) => {
112        if let Some(v) = $self.$name {
113            let f = $make_pred;
114            let p = f(v);
115            $vec.push(p);
116        }
117    };
118}
119
120impl_pred!(f32; f32; @core);
121impl_pred!(f64; f64; @core);