use crate::helper_macros::{is_none, is_none_range};
use core::fmt::Display;
use super::{Filter, Operator};
impl_as_graphql_id_filter!(String);
impl_as_graphql_filter! {string(String)}
impl_as_graphql_filter! {option_string(String)}
impl_as_graphql_filter! {array(String)}
impl_as_graphql_filter! {optional_array(String)}
impl_as_db_filter! {string(String)}
impl_as_db_filter! {array(String)}
impl_as_db_filter! {optional_array(String)}
impl_as_db_filter! {option_string(String)}
filter!(StringFilter: [StringOperator; 20],
extra_bounds: {Display},
extra_binds: {
Contains => bind_surround,
ContainsNoCase => bind_surround,
NotContains => bind_surround,
NotContainsNoCase => bind_surround,
StartsWith => bind_prefix,
StartsWithNoCase => bind_prefix,
EndsWith => bind_suffix,
EndsWithNoCase => bind_suffix,
NotStartsWith => bind_prefix,
NotStartsWithNoCase => bind_prefix,
NotEndsWith => bind_suffix,
NotEndsWithNoCase => bind_suffix,
},
null { },
primitive {
0: Eq:eq:"",
1: Not:not:"not",
2: Gt:gt:"gt",
3: Gte:gte:"gte",
4: Lt:lt:"lt",
5: Lte:lte:"lte",
6: Contains:contains:"contains",
7: ContainsNoCase:contains_nocase:"contains_nocase",
8: NotContains:not_contains:"not_contains",
9: NotContainsNoCase:not_contains_nocase:"not_contains_nocase",
10: StartsWith:starts_with:"starts_with",
11: StartsWithNoCase:starts_with_nocase:"starts_with_nocase",
12: NotStartsWith:not_starts_with:"not_starts_with",
13: NotStartsWithNoCase:not_starts_with_nocase:"not_starts_with_nocase",
14: EndsWith:ends_with:"ends_with",
15: EndsWithNoCase:ends_with_nocase:"ends_with_nocase",
16: NotEndsWith:not_ends_with:"not_ends_with",
17: NotEndsWithNoCase:not_ends_with_nocase:"not_ends_with_nocase"
},
primitives {
18: In:in_:"in",
19: NotIn:not_in:"not_in"
}
);
filter!(OptionalStringFilter: [OptionalStringOperator; 21],
extra_bounds: {Display},
extra_binds: {
Contains => bind_surround,
ContainsNoCase => bind_surround,
NotContains => bind_surround,
NotContainsNoCase => bind_surround,
StartsWith => bind_prefix,
StartsWithNoCase => bind_prefix,
EndsWith => bind_suffix,
EndsWithNoCase => bind_suffix,
NotStartsWith => bind_prefix,
NotStartsWithNoCase => bind_prefix,
NotEndsWith => bind_suffix,
NotEndsWithNoCase => bind_suffix,
},
null { 20:Null:null:"null" },
primitive {
0: Eq:eq:"",
1: Not:not:"not",
2: Gt:gt:"gt",
3: Gte:gte:"gte",
4: Lt:lt:"lt",
5: Lte:lte:"lte",
6: Contains:contains:"contains",
7: ContainsNoCase:contains_nocase:"contains_nocase",
8: NotContains:not_contains:"not_contains",
9: NotContainsNoCase:not_contains_nocase:"not_contains_nocase",
10: StartsWith:starts_with:"starts_with",
11: StartsWithNoCase:starts_with_nocase:"starts_with_nocase",
12: NotStartsWith:not_starts_with:"not_starts_with",
13: NotStartsWithNoCase:not_starts_with_nocase:"not_starts_with_nocase",
14: EndsWith:ends_with:"ends_with",
15: EndsWithNoCase:ends_with_nocase:"ends_with_nocase",
16: NotEndsWith:not_ends_with:"not_ends_with",
17: NotEndsWithNoCase:not_ends_with_nocase:"not_ends_with_nocase"
},
primitives {
18: In:in_:"in",
19: NotIn:not_in:"not_in"
}
);