Skip to main content

linear_queries/
filters.rs

1use crate::scalars::DateTimeOrDuration;
2use linear_schema::linear as schema;
3
4#[derive(cynic::InputObject, Clone, Debug, Default)]
5#[cynic(schema = "linear")]
6pub struct StringComparator {
7    #[cynic(skip_serializing_if = "Option::is_none")]
8    pub eq: Option<String>,
9    #[cynic(skip_serializing_if = "Option::is_none")]
10    pub contains: Option<String>,
11    #[cynic(rename = "containsIgnoreCase", skip_serializing_if = "Option::is_none")]
12    pub contains_ignore_case: Option<String>,
13}
14
15#[derive(cynic::InputObject, Clone, Debug, Default)]
16#[cynic(schema = "linear")]
17pub struct NullableStringComparator {
18    #[cynic(skip_serializing_if = "Option::is_none")]
19    pub eq: Option<String>,
20    #[cynic(skip_serializing_if = "Option::is_none")]
21    pub contains: Option<String>,
22    #[cynic(rename = "containsIgnoreCase", skip_serializing_if = "Option::is_none")]
23    pub contains_ignore_case: Option<String>,
24}
25
26#[derive(cynic::InputObject, Clone, Debug, Default)]
27#[cynic(schema = "linear")]
28pub struct NullableNumberComparator {
29    #[cynic(skip_serializing_if = "Option::is_none")]
30    pub eq: Option<f64>,
31    #[cynic(skip_serializing_if = "Option::is_none")]
32    pub gte: Option<f64>,
33    #[cynic(skip_serializing_if = "Option::is_none")]
34    pub lte: Option<f64>,
35}
36
37#[derive(cynic::InputObject, Clone, Debug, Default)]
38#[cynic(schema = "linear")]
39pub struct NumberComparator {
40    #[cynic(skip_serializing_if = "Option::is_none")]
41    pub eq: Option<f64>,
42    #[cynic(skip_serializing_if = "Option::is_none")]
43    pub gte: Option<f64>,
44    #[cynic(skip_serializing_if = "Option::is_none")]
45    pub lte: Option<f64>,
46}
47
48/// ID comparator for filtering by entity IDs
49#[derive(cynic::InputObject, Clone, Debug, Default)]
50#[cynic(schema = "linear", graphql_type = "IDComparator")]
51pub struct IdComparator {
52    #[cynic(skip_serializing_if = "Option::is_none")]
53    pub eq: Option<cynic::Id>,
54}
55
56/// Date comparator for filtering by date ranges
57#[derive(cynic::InputObject, Clone, Debug, Default)]
58#[cynic(schema = "linear")]
59pub struct DateComparator {
60    #[cynic(skip_serializing_if = "Option::is_none")]
61    pub eq: Option<DateTimeOrDuration>,
62    #[cynic(skip_serializing_if = "Option::is_none")]
63    pub gte: Option<DateTimeOrDuration>,
64    #[cynic(skip_serializing_if = "Option::is_none")]
65    pub lte: Option<DateTimeOrDuration>,
66}
67
68/// Filter for workflow state (by ID)
69#[derive(cynic::InputObject, Clone, Debug, Default)]
70#[cynic(schema = "linear")]
71pub struct WorkflowStateFilter {
72    #[cynic(skip_serializing_if = "Option::is_none")]
73    pub id: Option<IdComparator>,
74    #[cynic(skip_serializing_if = "Option::is_none")]
75    pub name: Option<StringComparator>,
76    #[cynic(skip_serializing_if = "Option::is_none")]
77    pub team: Option<TeamFilter>,
78}
79
80/// Filter for nullable user fields (by ID)
81#[derive(cynic::InputObject, Clone, Debug, Default)]
82#[cynic(schema = "linear")]
83pub struct NullableUserFilter {
84    #[cynic(skip_serializing_if = "Option::is_none")]
85    pub id: Option<IdComparator>,
86}
87
88/// Filter for team (by ID or key)
89#[derive(cynic::InputObject, Clone, Debug, Default)]
90#[cynic(schema = "linear")]
91pub struct TeamFilter {
92    #[cynic(skip_serializing_if = "Option::is_none")]
93    pub id: Option<IdComparator>,
94    #[cynic(skip_serializing_if = "Option::is_none")]
95    pub key: Option<StringComparator>,
96}
97
98/// Filter for nullable project fields (by ID)
99#[derive(cynic::InputObject, Clone, Debug, Default)]
100#[cynic(schema = "linear")]
101pub struct NullableProjectFilter {
102    #[cynic(skip_serializing_if = "Option::is_none")]
103    pub id: Option<IdComparator>,
104}
105
106// ============================================================================
107// Metadata query filters
108// ============================================================================
109
110/// User filtering options (uses displayName for name search per schema).
111#[derive(cynic::InputObject, Clone, Debug, Default)]
112#[cynic(schema = "linear")]
113pub struct UserFilter {
114    #[cynic(rename = "displayName", skip_serializing_if = "Option::is_none")]
115    pub display_name: Option<StringComparator>,
116}
117
118/// Project filtering options.
119#[derive(cynic::InputObject, Clone, Debug, Default)]
120#[cynic(schema = "linear")]
121pub struct ProjectFilter {
122    #[cynic(skip_serializing_if = "Option::is_none")]
123    pub name: Option<StringComparator>,
124}
125
126/// Nullable team filter (for IssueLabelFilter.team which uses NullableTeamFilter in schema)
127#[derive(cynic::InputObject, Clone, Debug, Default)]
128#[cynic(schema = "linear")]
129pub struct NullableTeamFilter {
130    #[cynic(skip_serializing_if = "Option::is_none")]
131    pub id: Option<IdComparator>,
132    #[cynic(skip_serializing_if = "Option::is_none")]
133    pub key: Option<StringComparator>,
134}
135
136/// Issue label filtering options.
137#[derive(cynic::InputObject, Clone, Debug, Default)]
138#[cynic(schema = "linear")]
139pub struct IssueLabelFilter {
140    #[cynic(skip_serializing_if = "Option::is_none")]
141    pub name: Option<StringComparator>,
142    #[cynic(skip_serializing_if = "Option::is_none")]
143    pub team: Option<NullableTeamFilter>,
144}
145
146// ============================================================================
147// Issue filter
148// ============================================================================
149
150#[derive(cynic::InputObject, Clone, Debug, Default)]
151#[cynic(schema = "linear")]
152pub struct IssueFilter {
153    #[cynic(skip_serializing_if = "Option::is_none")]
154    pub title: Option<StringComparator>,
155    #[cynic(skip_serializing_if = "Option::is_none")]
156    pub description: Option<NullableStringComparator>,
157    #[cynic(skip_serializing_if = "Option::is_none")]
158    pub priority: Option<NullableNumberComparator>,
159    #[cynic(skip_serializing_if = "Option::is_none")]
160    pub state: Option<WorkflowStateFilter>,
161    #[cynic(skip_serializing_if = "Option::is_none")]
162    pub assignee: Option<NullableUserFilter>,
163    #[cynic(skip_serializing_if = "Option::is_none")]
164    pub team: Option<TeamFilter>,
165    #[cynic(skip_serializing_if = "Option::is_none")]
166    pub project: Option<NullableProjectFilter>,
167    #[cynic(rename = "createdAt", skip_serializing_if = "Option::is_none")]
168    pub created_at: Option<DateComparator>,
169    #[cynic(rename = "updatedAt", skip_serializing_if = "Option::is_none")]
170    pub updated_at: Option<DateComparator>,
171    #[cynic(skip_serializing_if = "Option::is_none")]
172    pub number: Option<NumberComparator>,
173}