Skip to main content

ferriorm_runtime/
filter.rs

1//! Type-safe filter types for query WHERE clauses.
2//!
3//! Each scalar type has a corresponding filter struct (e.g., [`StringFilter`],
4//! [`IntFilter`], [`DateTimeFilter`]) with fields like `equals`, `not`,
5//! `contains`, `gt`, `lt`, `in`, etc. Enums use the generic [`EnumFilter<E>`].
6//!
7//! Generated `WhereInput` structs compose these filters and implement the
8//! `WhereClause` trait to append SQL conditions to a `SqlBuilder`.
9
10/// Filter operations for String fields.
11#[derive(Debug, Clone, Default)]
12pub struct StringFilter {
13    pub equals: Option<String>,
14    pub not: Option<String>,
15    pub contains: Option<String>,
16    pub starts_with: Option<String>,
17    pub ends_with: Option<String>,
18    pub r#in: Option<Vec<String>>,
19    pub not_in: Option<Vec<String>>,
20    pub mode: Option<QueryMode>,
21}
22
23/// Filter operations for nullable String fields.
24#[derive(Debug, Clone, Default)]
25pub struct NullableStringFilter {
26    /// `Some(None)` means IS NULL, `Some(Some(v))` means equals v.
27    pub equals: Option<Option<String>>,
28    pub not: Option<Option<String>>,
29    pub contains: Option<String>,
30    pub starts_with: Option<String>,
31    pub ends_with: Option<String>,
32    pub r#in: Option<Vec<String>>,
33    pub not_in: Option<Vec<String>>,
34    pub mode: Option<QueryMode>,
35}
36
37/// Filter operations for i32 fields.
38#[derive(Debug, Clone, Default)]
39pub struct IntFilter {
40    pub equals: Option<i32>,
41    pub not: Option<i32>,
42    pub gt: Option<i32>,
43    pub gte: Option<i32>,
44    pub lt: Option<i32>,
45    pub lte: Option<i32>,
46    pub r#in: Option<Vec<i32>>,
47    pub not_in: Option<Vec<i32>>,
48}
49
50/// Filter operations for i64 fields.
51#[derive(Debug, Clone, Default)]
52pub struct BigIntFilter {
53    pub equals: Option<i64>,
54    pub not: Option<i64>,
55    pub gt: Option<i64>,
56    pub gte: Option<i64>,
57    pub lt: Option<i64>,
58    pub lte: Option<i64>,
59    pub r#in: Option<Vec<i64>>,
60    pub not_in: Option<Vec<i64>>,
61}
62
63/// Filter operations for f64 fields.
64#[derive(Debug, Clone, Default)]
65pub struct FloatFilter {
66    pub equals: Option<f64>,
67    pub not: Option<f64>,
68    pub gt: Option<f64>,
69    pub gte: Option<f64>,
70    pub lt: Option<f64>,
71    pub lte: Option<f64>,
72}
73
74/// Filter operations for bool fields.
75#[derive(Debug, Clone, Default)]
76pub struct BoolFilter {
77    pub equals: Option<bool>,
78    pub not: Option<bool>,
79}
80
81/// Filter operations for DateTime fields.
82#[derive(Debug, Clone, Default)]
83pub struct DateTimeFilter {
84    pub equals: Option<chrono::DateTime<chrono::Utc>>,
85    pub not: Option<chrono::DateTime<chrono::Utc>>,
86    pub gt: Option<chrono::DateTime<chrono::Utc>>,
87    pub gte: Option<chrono::DateTime<chrono::Utc>>,
88    pub lt: Option<chrono::DateTime<chrono::Utc>>,
89    pub lte: Option<chrono::DateTime<chrono::Utc>>,
90    pub r#in: Option<Vec<chrono::DateTime<chrono::Utc>>>,
91}
92
93/// Filter operations for enum fields (generic over the enum type).
94#[derive(Debug, Clone)]
95pub struct EnumFilter<E: Clone> {
96    pub equals: Option<E>,
97    pub not: Option<E>,
98    pub r#in: Option<Vec<E>>,
99    pub not_in: Option<Vec<E>>,
100}
101
102impl<E: Clone> Default for EnumFilter<E> {
103    fn default() -> Self {
104        Self {
105            equals: None,
106            not: None,
107            r#in: None,
108            not_in: None,
109        }
110    }
111}
112
113/// Query mode for string operations.
114#[derive(Debug, Clone, Copy, PartialEq, Eq)]
115pub enum QueryMode {
116    Default,
117    Insensitive,
118}