• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rwjdk / TrelloDotNet / 13662485221

04 Mar 2025 08:37PM UTC coverage: 67.357% (-4.7%) from 72.018%
13662485221

push

github

rwjdk
Removed [ExcludeFromCodeCoverage] (Not the right way to approch this)

2001 of 3425 branches covered (58.42%)

Branch coverage included in aggregate %.

3820 of 5217 relevant lines covered (73.22%)

91.52 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

58.77
/src/TrelloDotNet/Extensions/CardsExtensions.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Diagnostics.CodeAnalysis;
4
using System.Linq;
5
using System.Text.RegularExpressions;
6
using TrelloDotNet.Model;
7

8
namespace TrelloDotNet.Extensions
9
{
10
    /// <summary>
11
    /// Extensions for list of Cards
12
    /// </summary>
13
    public static class CardsExtensions
14
    {
15
        /// <summary>
16
        /// Filter list of cards based on a set of conditions
17
        /// </summary>
18
        /// <param name="cards">The list of cards</param>
19
        /// <param name="conditions">The conditions to apply</param>
20
        /// <returns></returns>
21
        public static List<Card> Filter(this IEnumerable<Card> cards, params CardsFilterCondition[] conditions)
22
        {
23
            foreach (CardsFilterCondition entry in conditions)
966✔
24
            {
25
                switch (entry.Field)
243!
26
                {
27
                    case CardsConditionField.Name:
28
                        cards = FilterName(cards, entry);
27✔
29
                        break;
27✔
30
                    case CardsConditionField.ListId:
31
                        cards = FilterListId(cards, entry);
10✔
32
                        break;
8✔
33
                    case CardsConditionField.ListName:
34
                        cards = FilterListName(cards, entry);
24✔
35
                        break;
22✔
36
                    case CardsConditionField.LabelId:
37
                        cards = FilterLabelId(cards, entry);
22✔
38
                        break;
22✔
39
                    case CardsConditionField.LabelName:
40
                        cards = FilterLabelName(cards, entry);
24✔
41
                        break;
24✔
42
                    case CardsConditionField.MemberId:
43
                        cards = FilterMemberId(cards, entry);
20✔
44
                        break;
20✔
45
                    case CardsConditionField.MemberName:
46
                        cards = FilterMemberName(cards, entry);
24✔
47
                        break;
24✔
48
                    case CardsConditionField.Description:
49
                        cards = FilterDescription(cards, entry);
26✔
50
                        break;
26✔
51
                    case CardsConditionField.DueWithNoDueComplete:
52
                        cards = FilterDueDateNoDueComplete(cards, entry);
16✔
53
                        break;
16✔
54
                    case CardsConditionField.Due:
55
                        cards = FilterDueDate(cards, entry);
16✔
56
                        break;
16✔
57
                    case CardsConditionField.Start:
58
                        cards = FilterStartDate(cards, entry);
16✔
59
                        break;
16✔
60
                    case CardsConditionField.Created:
61
                        cards = FilterCreateDate(cards, entry);
16✔
62
                        break;
14✔
63
                    case CardsConditionField.CustomField:
64
                        cards = FilterCustomField(cards, entry);
×
65
                        break;
×
66
                    case CardsConditionField.DueComplete:
67
                        cards = FilterDueComplete(cards, entry);
2✔
68
                        break;
69
                }
70
            }
71

72
            return cards.ToList();
237✔
73
        }
74

75
        private static IEnumerable<Card> FilterLabelName(IEnumerable<Card> cards, CardsFilterCondition entry)
76
        {
77
            switch (entry.Condition)
24!
78
            {
79
                case CardsCondition.AllOfThese:
80
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
81
                    {
82
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
83
                    }
84

85
                    return cards.Where(x => x.Labels.Any(y => y.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
7✔
86

87
                case CardsCondition.Equal:
88
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
89
                    {
90
                        return cards.Where(x => { return x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
9✔
91
                    }
92

93
                    // ReSharper disable once ConvertIfStatementToReturnStatement
94
                    if (entry.ValueAsNumber.HasValue)
1!
95
                    {
96
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsNumber.Value);
×
97
                    }
98

99
                    return cards.Where(x => x.LabelIds.Count == 1 && x.Labels.Any(z => z.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
5✔
100

101
                case CardsCondition.AnyOfThese:
102

103
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
104
                    {
105
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
106
                    }
107

108
                    return cards.Where(x => x.Labels.Any(z => z.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
109

110
                case CardsCondition.NoneOfThese:
111
                case CardsCondition.NotEqual:
112
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
113
                    {
114
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
28✔
115
                    }
116

117
                    // ReSharper disable once ConvertIfStatementToReturnStatement
118
                    if (entry.ValueAsNumber.HasValue)
2!
119
                    {
120
                        return cards.Where(x => x.LabelIds.Count != entry.ValueAsNumber.Value);
×
121
                    }
122

123
                    return cards.Where(x => !x.Labels.Any(z => z.Name.Equals(entry.ValueAsString)));
14✔
124

125
                case CardsCondition.DoNotHaveAnyValue:
126
                    return cards.Where(x => x.LabelIds.Count == 0);
×
127
                case CardsCondition.HasAnyValue:
128
                    return cards.Where(x => x.LabelIds.Count != 0);
×
129
                case CardsCondition.GreaterThan:
130
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
×
131
                case CardsCondition.LessThan:
132
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
×
133
                case CardsCondition.GreaterThanOrEqual:
134
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
×
135
                case CardsCondition.LessThanOrEqual:
136
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
×
137
                case CardsCondition.Between:
138
                {
139
                    if (entry.ValueAsNumbers?.Count != 2)
×
140
                    {
141
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
142
                    }
143

144
                    decimal from = entry.ValueAsNumbers.First();
×
145
                    decimal to = entry.ValueAsNumbers.Last();
×
146
                    cards = cards.Where(x => x.LabelIds.Count >= from);
×
147
                    cards = cards.Where(x => x.LabelIds.Count <= to);
×
148
                    return cards;
×
149
                }
150
                case CardsCondition.NotBetween:
151
                {
152
                    if (entry.ValueAsNumbers?.Count != 2)
×
153
                    {
154
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
155
                    }
156

157
                    decimal from = entry.ValueAsNumbers.First();
×
158
                    decimal to = entry.ValueAsNumbers.Last();
×
159
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
×
160
                    return cards;
×
161
                }
162
                case CardsCondition.Contains:
163
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
164
                    {
165
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Contains(y))); });
16✔
166
                    }
167

168
                    return cards.Where(x => x.Labels.Any(z => z.Name.Contains(entry.ValueAsString)));
7✔
169
                case CardsCondition.DoNotContains:
170
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2!
171
                    {
172
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.Contains(y))); });
×
173
                    }
174

175
                    return cards.Where(x => x.Labels.All(z => !z.Name.Contains(entry.ValueAsString)));
14✔
176
                case CardsCondition.RegEx:
177
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
178
                    {
179
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => Regex.IsMatch(z.Name, y, RegexOptions.IgnoreCase))); });
12✔
180
                    }
181

182
                    return cards.Where(x => x.Labels.Any(z => Regex.IsMatch(z.Name, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
183
                case CardsCondition.StartsWith:
184
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
185
                    {
186
                        return cards.Where(x => { return x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
6✔
187
                    }
188

189
                    return cards.Where(x => x.Labels.Any(z => z.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
190
                case CardsCondition.DoNotStartWith:
191
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
192
                    {
193
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
194
                    }
195

196
                    return cards.Where(x => x.Labels.All(z => !z.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
197
                case CardsCondition.EndsWith:
198
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
199
                    {
200
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
201
                    }
202

203
                    return cards.Where(x => x.Labels.Any(z => z.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
204
                case CardsCondition.DoNotEndWith:
205
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
206
                    {
207
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
16✔
208
                    }
209

210
                    return cards.Where(x => x.Labels.All(z => !z.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
7✔
211
                default:
212
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
213
            }
214
        }
215

216
        private static IEnumerable<Card> FilterListName(IEnumerable<Card> cards, CardsFilterCondition entry)
217
        {
218
            switch (entry.Condition)
24✔
219
            {
220
                case CardsCondition.AnyOfThese:
221
                case CardsCondition.Equal:
222
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
223
                    {
224
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
225
                    }
226

227
                    return cards.Where(x => x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
228
                case CardsCondition.NoneOfThese:
229
                case CardsCondition.NotEqual:
230
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
231
                    {
232
                        return cards.Where(x => entry.ValueAsStrings.All(y => !y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
233
                    }
234

235
                    return cards.Where(x => !x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
236
                case CardsCondition.Contains:
237
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
238
                    {
239
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.Contains(y)));
10✔
240
                    }
241

242
                    return cards.Where(x => x.List.Name.Contains(entry.ValueAsString));
4✔
243
                case CardsCondition.DoNotContains:
244
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
245
                    {
246
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.Contains(y)));
10✔
247
                    }
248

249
                    return cards.Where(x => !x.List.Name.Contains(entry.ValueAsString));
4✔
250
                case CardsCondition.RegEx:
251
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
252
                    {
253
                        return cards.Where(x => entry.ValueAsStrings.Any(y => Regex.IsMatch(x.List.Name, y, RegexOptions.IgnoreCase)));
7✔
254
                    }
255

256
                    return cards.Where(x => Regex.IsMatch(x.List.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
257
                case CardsCondition.StartsWith:
258
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
259
                    {
260
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
261
                    }
262

263
                    return cards.Where(x => x.List.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
264
                case CardsCondition.EndsWith:
265
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
266
                    {
267
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
268
                    }
269

270
                    return cards.Where(x => x.List.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
271
                case CardsCondition.DoNotStartWith:
272
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
273
                    {
274
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
275
                    }
276

277
                    return cards.Where(x => !x.List.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
278
                case CardsCondition.DoNotEndWith:
279
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
280
                    {
281
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
282
                    }
283

284
                    return cards.Where(x => !x.List.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
285
                default:
286
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
287
            }
288
        }
289

290
        private static IEnumerable<Card> FilterDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
291
        {
292
            switch (entry.Condition)
2!
293
            {
294
                case CardsCondition.Equal:
295
                    return cards.Where(x => x.DueComplete == entry.ValueAsBoolean);
8✔
296
                case CardsCondition.NotEqual:
297
                    return cards.Where(x => x.DueComplete != entry.ValueAsBoolean);
×
298
                default:
299
                    throw new TrelloApiException($"{entry.Condition} on DueComplete Filter does not make sense");
×
300
            }
301
        }
302

303
        private static IEnumerable<Card> FilterCustomField(IEnumerable<Card> cards, CardsFilterCondition entry)
304
        {
305
            if (entry.CustomFieldEntry == null)
×
306
            {
307
                throw new TrelloApiException("CustomField was not provided");
×
308
            }
309

310
            var customFieldDefinition = entry.CustomFieldEntry;
×
311

312
            cards = cards.Where(x =>
×
313
            {
×
314
                CustomFieldItem customFieldItem = x.CustomFieldItems.FirstOrDefault(y => y.CustomFieldId == customFieldDefinition.Id);
×
315
                switch (entry.Condition)
×
316
                {
×
317
                    case CardsCondition.HasAnyValue:
×
318
                        return customFieldItem != null;
×
319
                    case CardsCondition.DoNotHaveAnyValue:
×
320
                        return customFieldItem == null;
×
321
                }
×
322

×
323
                switch (customFieldDefinition.Type)
×
324
                {
×
325
                    case CustomFieldType.Checkbox:
×
326
                        var @checked = customFieldItem?.Value.Checked ?? false;
×
327
                        switch (entry.Condition)
×
328
                        {
×
329
                            case CardsCondition.Equal:
×
330
                                return @checked == entry.ValueAsBoolean;
×
331
                            case CardsCondition.NotEqual:
×
332
                                return @checked != entry.ValueAsBoolean;
×
333
                            default:
×
334
                                throw new TrelloApiException($"Custom Field of Type Checkbox can't use Condition '{entry.Condition}'");
×
335
                        }
×
336
                    case CustomFieldType.Date:
×
337
                        var date = customFieldItem?.Value.Date;
×
338
                        switch (entry.Condition)
×
339
                        {
×
340
                            case CardsCondition.Equal:
×
341
                                return date.HasValue && date.Value == entry.ValueAsDateTimeOffset;
×
342
                            case CardsCondition.NotEqual:
×
343
                                return !date.HasValue || date.Value != entry.ValueAsDateTimeOffset;
×
344
                            case CardsCondition.GreaterThan:
×
345
                                return date.HasValue && date.Value > entry.ValueAsDateTimeOffset;
×
346
                            case CardsCondition.LessThan:
×
347
                                return date.HasValue && date.Value < entry.ValueAsDateTimeOffset;
×
348
                            case CardsCondition.GreaterThanOrEqual:
×
349
                                return date.HasValue && date.Value >= entry.ValueAsDateTimeOffset;
×
350
                            case CardsCondition.LessThanOrEqual:
×
351
                                return date.HasValue && date.Value <= entry.ValueAsDateTimeOffset;
×
352
                            case CardsCondition.AnyOfThese:
×
353
                                return date.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == date.Value);
×
354
                            case CardsCondition.NoneOfThese:
×
355
                                return date.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != date.Value);
×
356
                            case CardsCondition.Between:
×
357
                            {
×
358
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
359
                                {
×
360
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Dates");
×
361
                                }
×
362

×
363
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
364
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
365
                                return date.HasValue && date.Value >= from && date.Value <= to;
×
366
                            }
×
367
                            case CardsCondition.NotBetween:
×
368
                            {
×
369
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
370
                                {
×
371
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Dates");
×
372
                                }
×
373

×
374
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
375
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
376
                                return (date.HasValue && date.Value > to) || (date.HasValue && date.Value < from);
×
377
                            }
×
378
                            default:
×
379
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Date");
×
380
                        }
×
381
                    case CustomFieldType.List:
×
382
                        string listValue = customFieldDefinition.Options.FirstOrDefault(y => y.Id == customFieldItem?.ValueId)?.Value.Text ?? string.Empty;
×
383
                        switch (entry.Condition)
×
384
                        {
×
385
                            case CardsCondition.Equal:
×
386
                                return listValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
387
                            case CardsCondition.NotEqual:
×
388
                                return listValue != entry.ValueAsString;
×
389
                            case CardsCondition.GreaterThan:
×
390
                                return listValue.Length > entry.ValueAsNumber;
×
391
                            case CardsCondition.LessThan:
×
392
                                return listValue.Length < entry.ValueAsNumber;
×
393
                            case CardsCondition.GreaterThanOrEqual:
×
394
                                return listValue.Length >= entry.ValueAsNumber;
×
395
                            case CardsCondition.LessThanOrEqual:
×
396
                                return listValue.Length <= entry.ValueAsNumber;
×
397
                            case CardsCondition.Contains:
×
398
                                return listValue.Contains(entry.ValueAsString);
×
399
                            case CardsCondition.DoNotContains:
×
400
                                return !listValue.Contains(entry.ValueAsString);
×
401
                            case CardsCondition.AnyOfThese:
×
402
                                return entry.ValueAsStrings?.Any(y => y.Equals(listValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
403
                            case CardsCondition.NoneOfThese:
×
404
                                return entry.ValueAsStrings?.All(y => y != listValue) ?? false;
×
405
                            case CardsCondition.RegEx:
×
406
                                return Regex.IsMatch(listValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
407
                            case CardsCondition.StartsWith:
×
408
                                return listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
409
                            case CardsCondition.EndsWith:
×
410
                                return listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
411
                            case CardsCondition.DoNotStartWith:
×
412
                                return !listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
413
                            case CardsCondition.DoNotEndWith:
×
414
                                return !listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
415
                            case CardsCondition.AllOfThese:
×
416
                            default:
×
417
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type List");
×
418
                        }
×
419
                    case CustomFieldType.Number:
×
420
                        var number = customFieldItem?.Value.Number ?? decimal.MinValue;
×
421
                        switch (entry.Condition)
×
422
                        {
×
423
                            case CardsCondition.Equal:
×
424
                                return number == entry.ValueAsNumber;
×
425
                            case CardsCondition.NotEqual:
×
426
                                return number != entry.ValueAsNumber;
×
427
                            case CardsCondition.GreaterThan:
×
428
                                return number > entry.ValueAsNumber;
×
429
                            case CardsCondition.LessThan:
×
430
                                return number < entry.ValueAsNumber;
×
431
                            case CardsCondition.GreaterThanOrEqual:
×
432
                                return number >= entry.ValueAsNumber;
×
433
                            case CardsCondition.LessThanOrEqual:
×
434
                                return number <= entry.ValueAsNumber;
×
435
                            case CardsCondition.AnyOfThese:
×
436
                                return entry.ValueAsNumbers.Any(y => y == number);
×
437
                            case CardsCondition.NoneOfThese:
×
438
                                return entry.ValueAsNumbers.All(y => y != number);
×
439
                            case CardsCondition.Between:
×
440
                            {
×
441
                                if (entry.ValueAsNumbers?.Count != 2)
×
442
                                {
×
443
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Numbers");
×
444
                                }
×
445

×
446
                                decimal from = entry.ValueAsNumbers.First();
×
447
                                decimal to = entry.ValueAsNumbers.Last();
×
448
                                return number >= from && number <= to;
×
449
                            }
×
450
                            case CardsCondition.NotBetween:
×
451
                            {
×
452
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
453
                                {
×
454
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Numbers");
×
455
                                }
×
456

×
457
                                decimal from = entry.ValueAsNumbers.First();
×
458
                                decimal to = entry.ValueAsNumbers.Last();
×
459
                                return number > to || number < from;
×
460
                            }
×
461
                            default:
×
462
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Number");
×
463
                        }
×
464
                    case CustomFieldType.Text:
×
465
                    default:
×
466
                        string textValue = customFieldItem?.Value.Text ?? string.Empty;
×
467
                        switch (entry.Condition)
×
468
                        {
×
469
                            case CardsCondition.Equal:
×
470
                                return textValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
471
                            case CardsCondition.NotEqual:
×
472
                                return textValue != entry.ValueAsString;
×
473
                            case CardsCondition.GreaterThan:
×
474
                                return textValue.Length > entry.ValueAsNumber;
×
475
                            case CardsCondition.LessThan:
×
476
                                return textValue.Length < entry.ValueAsNumber;
×
477
                            case CardsCondition.GreaterThanOrEqual:
×
478
                                return textValue.Length >= entry.ValueAsNumber;
×
479
                            case CardsCondition.LessThanOrEqual:
×
480
                                return textValue.Length <= entry.ValueAsNumber;
×
481
                            case CardsCondition.Contains:
×
482
                                return textValue.Contains(entry.ValueAsString);
×
483
                            case CardsCondition.DoNotContains:
×
484
                                return !textValue.Contains(entry.ValueAsString);
×
485
                            case CardsCondition.AnyOfThese:
×
486
                                return entry.ValueAsStrings?.Any(y => y.Equals(textValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
487
                            case CardsCondition.NoneOfThese:
×
488
                                return entry.ValueAsStrings?.All(y => y != textValue) ?? false;
×
489
                            case CardsCondition.RegEx:
×
490
                                return Regex.IsMatch(textValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
491
                            case CardsCondition.StartsWith:
×
492
                                return textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
493
                            case CardsCondition.EndsWith:
×
494
                                return textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
495
                            case CardsCondition.DoNotStartWith:
×
496
                                return !textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
497
                            case CardsCondition.DoNotEndWith:
×
498
                                return !textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
499
                            case CardsCondition.AllOfThese:
×
500
                            default:
×
501
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Text");
×
502
                        }
×
503
                }
×
504
            });
×
505

506
            return cards;
×
507
        }
508

509
        private static IEnumerable<Card> FilterDueDate(IEnumerable<Card> cards, CardsFilterCondition entry)
510
        {
511
            switch (entry.Condition)
16!
512
            {
513
                case CardsCondition.Equal:
514
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
515
                    {
516
                        return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y == x.Due.Value));
8!
517
                    }
518

519
                    return cards.Where(x => x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
4!
520
                case CardsCondition.NotEqual:
521
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
522
                    {
523
                        return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y != x.Due.Value));
9!
524
                    }
525

526
                    return cards.Where(x => x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
4!
527
                case CardsCondition.GreaterThan:
528
                    return cards.Where(x => x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
4!
529
                case CardsCondition.LessThan:
530
                    return cards.Where(x => x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
4!
531
                case CardsCondition.GreaterThanOrEqual:
532
                    return cards.Where(x => x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
4!
533
                case CardsCondition.LessThanOrEqual:
534
                    return cards.Where(x => x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
4!
535

536
                case CardsCondition.Between:
537
                {
538
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
539
                    {
540
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
541
                    }
542

543
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
544
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
545
                    cards = cards.Where(x => x.Due.HasValue && x.Due >= from);
4!
546
                    cards = cards.Where(x => x.Due.HasValue && x.Due <= to);
4!
547
                    return cards;
1✔
548
                }
549
                case CardsCondition.NotBetween:
550
                {
551
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
552
                    {
553
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
554
                    }
555

556
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
557
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
558
                    cards = cards.Where(x => x.Due.HasValue && x.Due > to || x.Due < from);
4!
559
                    return cards;
1✔
560
                }
561

562
                case CardsCondition.HasAnyValue:
563
                    return cards.Where(x => x.Due.HasValue);
4✔
564
                case CardsCondition.DoNotHaveAnyValue:
565
                    return cards.Where(x => !x.Due.HasValue);
4✔
566
                case CardsCondition.AnyOfThese:
567
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
568
                    {
569
                        return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
9✔
570
                    }
571

572
                    return cards.Where(x => x.Due != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date == x.Due.Value.Date);
4!
573
                case CardsCondition.NoneOfThese:
574
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
575
                    {
576
                        return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
9✔
577
                    }
578

579
                    return cards.Where(x => x.Due != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date != x.Due.Value.Date);
4!
580
                default:
581
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
582
            }
583
        }
584

585
        private static IEnumerable<Card> FilterDueDateNoDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
586
        {
587
            switch (entry.Condition)
16!
588
            {
589
                case CardsCondition.Equal:
590
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
591
                    {
592
                        return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y == x.Due.Value));
8!
593
                    }
594

595
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
4!
596
                case CardsCondition.NotEqual:
597
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
598
                    {
599
                        return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y != x.Due.Value));
9!
600
                    }
601

602
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
4!
603
                case CardsCondition.GreaterThan:
604
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
4!
605
                case CardsCondition.LessThan:
606
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
4!
607
                case CardsCondition.GreaterThanOrEqual:
608
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
4!
609
                case CardsCondition.LessThanOrEqual:
610
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
4!
611

612
                case CardsCondition.Between:
613
                {
614
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
615
                    {
616
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
617
                    }
618

619
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
620
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
621
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= from);
4!
622
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= to);
4!
623
                    return cards;
1✔
624
                }
625
                case CardsCondition.NotBetween:
626
                {
627
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
628
                    {
629
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
630
                    }
631

632
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
633
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
634
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > to || x.Due < from);
4!
635
                    return cards;
1✔
636
                }
637

638
                case CardsCondition.HasAnyValue:
639
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue);
4!
640
                case CardsCondition.DoNotHaveAnyValue:
641
                    return cards.Where(x => !x.Due.HasValue);
4✔
642
                case CardsCondition.AnyOfThese:
643
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
644
                    {
645
                        return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
9!
646
                    }
647

648
                    return cards.Where(x => !x.DueComplete && x.Due != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date == x.Due.Value.Date);
4!
649
                case CardsCondition.NoneOfThese:
650
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
651
                    {
652
                        return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
9!
653
                    }
654

655
                    return cards.Where(x => !x.DueComplete && x.Due != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date != x.Due.Value.Date);
4!
656
                default:
657
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
658
            }
659
        }
660

661
        private static IEnumerable<Card> FilterCreateDate(IEnumerable<Card> cards, CardsFilterCondition entry)
662
        {
663
            switch (entry.Condition)
16✔
664
            {
665
                case CardsCondition.Equal:
666
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
667
                    {
668
                        return cards.Where(x => x.Created.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y == x.Created.Value));
8!
669
                    }
670

671
                    return cards.Where(x => x.Created.HasValue && x.Created == entry.ValueAsDateTimeOffset);
4!
672
                case CardsCondition.NotEqual:
673
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
674
                    {
675
                        return cards.Where(x => x.Created.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => x.Created != null && y.Date != x.Created.Value));
10!
676
                    }
677

678
                    return cards.Where(x => x.Created.HasValue && x.Created != entry.ValueAsDateTimeOffset);
4!
679
                case CardsCondition.GreaterThan:
680
                    return cards.Where(x => x.Created.HasValue && x.Created > entry.ValueAsDateTimeOffset);
4!
681
                case CardsCondition.LessThan:
682
                    return cards.Where(x => x.Created.HasValue && x.Created < entry.ValueAsDateTimeOffset);
4!
683
                case CardsCondition.GreaterThanOrEqual:
684
                    return cards.Where(x => x.Created.HasValue && x.Created >= entry.ValueAsDateTimeOffset);
4!
685
                case CardsCondition.LessThanOrEqual:
686
                    return cards.Where(x => x.Created.HasValue && x.Created <= entry.ValueAsDateTimeOffset);
4!
687
                case CardsCondition.Between:
688
                {
689
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
690
                    {
691
                        throw new TrelloApiException("Between Condition for Created Date need 2 and only 2 Dates");
×
692
                    }
693

694
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
695
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
696
                    cards = cards.Where(x => x.Created.HasValue && x.Created >= from);
4!
697
                    cards = cards.Where(x => x.Created.HasValue && x.Created <= to);
4!
698
                    return cards;
1✔
699
                }
700
                case CardsCondition.NotBetween:
701
                {
702
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
703
                    {
704
                        throw new TrelloApiException("NotBetween Condition for Created Date need 2 and only 2 Dates");
×
705
                    }
706

707
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
708
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
709
                    cards = cards.Where(x => x.Created.HasValue && x.Created > to || x.Created < from);
4!
710
                    return cards;
1✔
711
                }
712
                case CardsCondition.AnyOfThese:
713
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
714
                    {
715
                        return cards.Where(x => entry.ValueAsDateTimeOffsets.Any(y => x.Created != null && y == x.Created.Value));
9!
716
                    }
717

718
                    return cards.Where(x => x.Created != null && entry.ValueAsDateTimeOffset == x.Created.Value);
4!
719

720
                case CardsCondition.NoneOfThese:
721
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
722
                    {
723
                        return cards.Where(x => entry.ValueAsDateTimeOffsets.All(y => x.Created != null && y != x.Created.Value));
9!
724
                    }
725

726
                    return cards.Where(x => x.Created != null && entry.ValueAsDateTimeOffset != x.Created.Value);
4!
727
                default:
728
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterCreateDate");
2✔
729
            }
730
        }
731

732
        private static IEnumerable<Card> FilterStartDate(IEnumerable<Card> cards, CardsFilterCondition entry)
733
        {
734
            switch (entry.Condition)
16!
735
            {
736
                case CardsCondition.Equal:
737
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
738
                    {
739
                        return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y.Date == x.Start.Value.Date));
8!
740
                    }
741

742
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date == entry.ValueAsDateTimeOffset.Value.Date);
4!
743
                case CardsCondition.NotEqual:
744
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
745
                    {
746
                        return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.All(y => y.Date != x.Start.Value.Date));
9!
747
                    }
748

749
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date != entry.ValueAsDateTimeOffset.Value.Date);
4!
750
                case CardsCondition.GreaterThan:
751
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date > entry.ValueAsDateTimeOffset.Value.Date);
4!
752
                case CardsCondition.LessThan:
753
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date < entry.ValueAsDateTimeOffset.Value.Date);
4!
754
                case CardsCondition.GreaterThanOrEqual:
755
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date >= entry.ValueAsDateTimeOffset.Value.Date);
4!
756
                case CardsCondition.LessThanOrEqual:
757
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date <= entry.ValueAsDateTimeOffset.Value.Date);
4!
758
                case CardsCondition.Between:
759
                {
760
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
761
                    {
762
                        throw new TrelloApiException("Between Condition for Start Date need 2 and only 2 Dates");
×
763
                    }
764

765
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
766
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
767
                    cards = cards.Where(x => x.Start.HasValue && x.Start >= from);
4!
768
                    cards = cards.Where(x => x.Start.HasValue && x.Start <= to);
4!
769
                    return cards;
1✔
770
                }
771
                case CardsCondition.NotBetween:
772
                {
773
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
1!
774
                    {
775
                        throw new TrelloApiException("NotBetween Condition for Start Date need 2 and only 2 Dates");
×
776
                    }
777

778
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
1✔
779
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
1✔
780
                    cards = cards.Where(x => x.Start.HasValue && x.Start > to || x.Start < from);
4!
781
                    return cards;
1✔
782
                }
783
                case CardsCondition.HasAnyValue:
784
                    return cards.Where(x => x.Start.HasValue);
4✔
785
                case CardsCondition.DoNotHaveAnyValue:
786
                    return cards.Where(x => !x.Start.HasValue);
4✔
787
                case CardsCondition.AnyOfThese:
788
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
789
                    {
790
                        return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y.Date == x.Start.Value.Date));
9!
791
                    }
792

793
                    return cards.Where(x => x.Start != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date == x.Start.Value.Date);
4!
794

795
                case CardsCondition.NoneOfThese:
796
                    if (entry.ValueAsDateTimeOffsets != null && entry.ValueAsDateTimeOffsets.Count != 0)
2✔
797
                    {
798
                        return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.All(y => y.Date != x.Start.Value.Date));
9!
799
                    }
800

801
                    return cards.Where(x => x.Start != null && entry.ValueAsDateTimeOffset != null && entry.ValueAsDateTimeOffset.Value.Date != x.Start.Value.Date);
4!
802

803
                default:
804
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterStartDate");
×
805
            }
806
        }
807

808
        private static IEnumerable<Card> FilterListId(IEnumerable<Card> cards, CardsFilterCondition entry)
809
        {
810
            switch (entry.Condition)
10✔
811
            {
812
                case CardsCondition.AnyOfThese:
813
                case CardsCondition.Equal:
814
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
815
                    {
816
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y == x.ListId));
18✔
817
                    }
818

819
                    return cards.Where(x => x.ListId == entry.ValueAsString);
8✔
820
                case CardsCondition.NoneOfThese:
821
                case CardsCondition.NotEqual:
822
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
823
                    {
824
                        return cards.Where(x => entry.ValueAsStrings.All(y => y != x.ListId));
18✔
825
                    }
826

827
                    return cards.Where(x => x.ListId != entry.ValueAsString);
8✔
828
                default:
829
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
830
            }
831
        }
832

833
        private static IEnumerable<Card> FilterLabelId(IEnumerable<Card> cards, CardsFilterCondition entry)
834
        {
835
            switch (entry.Condition)
22!
836
            {
837
                case CardsCondition.AllOfThese:
838
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
839
                    {
840
                        return cards.Where(x => entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
8✔
841
                    }
842

843
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
844

845
                case CardsCondition.Equal:
846
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
847
                    {
848
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
6✔
849
                    }
850

851
                    if (entry.ValueAsNumber.HasValue)
3✔
852
                    {
853
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsNumber.Value);
8✔
854
                    }
855

856
                    return cards.Where(x => x.LabelIds.Count == 1 && x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
857

858
                case CardsCondition.AnyOfThese:
859
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
860
                    {
861
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
9✔
862
                    }
863

864
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
865

866
                case CardsCondition.NoneOfThese:
867
                case CardsCondition.NotEqual:
868
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
6✔
869
                    {
870
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
20✔
871
                    }
872

873
                    if (entry.ValueAsNumber.HasValue)
4✔
874
                    {
875
                        return cards.Where(x => x.LabelIds.Count != entry.ValueAsNumber.Value);
8✔
876
                    }
877

878
                    return cards.Where(x => !x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
8✔
879
                case CardsCondition.DoNotHaveAnyValue:
880
                    return cards.Where(x => x.LabelIds.Count == 0);
4✔
881
                case CardsCondition.HasAnyValue:
882
                    return cards.Where(x => x.LabelIds.Count != 0);
4✔
883
                case CardsCondition.GreaterThan:
884
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
4✔
885
                case CardsCondition.LessThan:
886
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
4✔
887
                case CardsCondition.GreaterThanOrEqual:
888
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
4✔
889
                case CardsCondition.LessThanOrEqual:
890
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
4✔
891
                case CardsCondition.Between:
892
                {
893
                    if (entry.ValueAsNumbers?.Count != 2)
1!
894
                    {
895
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
896
                    }
897

898
                    decimal from = entry.ValueAsNumbers.First();
1✔
899
                    decimal to = entry.ValueAsNumbers.Last();
1✔
900
                    cards = cards.Where(x => x.LabelIds.Count >= from);
4✔
901
                    cards = cards.Where(x => x.LabelIds.Count <= to);
3✔
902
                    return cards;
1✔
903
                }
904
                case CardsCondition.NotBetween:
905
                {
906
                    if (entry.ValueAsNumbers?.Count != 2)
1!
907
                    {
908
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
909
                    }
910

911
                    decimal from = entry.ValueAsNumbers.First();
1✔
912
                    decimal to = entry.ValueAsNumbers.Last();
1✔
913
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
4!
914
                    return cards;
1✔
915
                }
916
                default:
917
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
918
            }
919
        }
920

921
        private static IEnumerable<Card> FilterMemberId(IEnumerable<Card> cards, CardsFilterCondition entry)
922
        {
923
            switch (entry.Condition)
20!
924
            {
925
                case CardsCondition.AllOfThese:
926
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
927
                    {
928
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
9✔
929
                    }
930

931
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
932

933
                case CardsCondition.Equal:
934
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
935
                    {
936
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
4!
937
                    }
938

939
                    if (entry.ValueAsNumber.HasValue)
2✔
940
                    {
941
                        return cards.Where(x => x.MemberIds.Count == entry.ValueAsNumber.Value);
4✔
942
                    }
943

944
                    return cards.Where(x => x.MemberIds.Count == 1 && x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
945

946
                case CardsCondition.AnyOfThese:
947

948
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
949
                    {
950
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
8✔
951
                    }
952

953
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
954

955
                case CardsCondition.NoneOfThese:
956
                case CardsCondition.NotEqual:
957
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
5✔
958
                    {
959
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
16✔
960
                    }
961

962
                    if (entry.ValueAsNumber.HasValue)
3✔
963
                    {
964
                        return cards.Where(x => x.MemberIds.Count != entry.ValueAsNumber.Value);
4✔
965
                    }
966

967
                    return cards.Where(x => !x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
8✔
968

969
                case CardsCondition.DoNotHaveAnyValue:
970
                    return cards.Where(x => x.MemberIds.Count == 0);
4✔
971
                case CardsCondition.HasAnyValue:
972
                    return cards.Where(x => x.MemberIds.Count != 0);
4✔
973
                case CardsCondition.GreaterThan:
974
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
4✔
975
                case CardsCondition.LessThan:
976
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
4✔
977
                case CardsCondition.GreaterThanOrEqual:
978
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
4✔
979
                case CardsCondition.LessThanOrEqual:
980
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
4✔
981
                case CardsCondition.Between:
982
                {
983
                    if (entry.ValueAsNumbers?.Count != 2)
2!
984
                    {
985
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
986
                    }
987

988
                    decimal from = entry.ValueAsNumbers.First();
2✔
989
                    decimal to = entry.ValueAsNumbers.Last();
2✔
990
                    cards = cards.Where(x => x.MemberIds.Count >= from);
8✔
991
                    cards = cards.Where(x => x.MemberIds.Count <= to);
6✔
992
                    return cards;
2✔
993
                }
994
                case CardsCondition.NotBetween:
995
                {
996
                    if (entry.ValueAsNumbers?.Count != 2)
×
997
                    {
998
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
999
                    }
1000

1001
                    decimal from = entry.ValueAsNumbers.First();
×
1002
                    decimal to = entry.ValueAsNumbers.Last();
×
1003
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
1004
                    return cards;
×
1005
                }
1006
                default:
1007
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
1008
            }
1009
        }
1010

1011
        private static IEnumerable<Card> FilterMemberName(IEnumerable<Card> cards, CardsFilterCondition entry)
1012
        {
1013
            switch (entry.Condition)
24!
1014
            {
1015
                case CardsCondition.AllOfThese:
1016
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1017
                    {
1018
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
13✔
1019
                    }
1020

1021
                    return cards.Where(x => x.Members.Any(y => y.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1022

1023
                case CardsCondition.Equal:
1024
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1025
                    {
1026
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
4!
1027
                    }
1028

1029
                    return cards.Where(x => x.MemberIds.Count == 1 && x.Members.Any(z => z.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1030

1031
                case CardsCondition.AnyOfThese:
1032

1033
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1034
                    {
1035
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
10✔
1036
                    }
1037

1038
                    return cards.Where(x => x.Members.Any(z => z.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1039

1040
                case CardsCondition.NoneOfThese:
1041
                case CardsCondition.NotEqual:
1042
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1043
                    {
1044
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
20✔
1045
                    }
1046

1047
                    return cards.Where(x => !x.Members.Any(z => z.FullName.Equals(entry.ValueAsString)));
12✔
1048

1049
                case CardsCondition.DoNotHaveAnyValue:
1050
                    return cards.Where(x => x.MemberIds.Count == 0);
×
1051
                case CardsCondition.HasAnyValue:
1052
                    return cards.Where(x => x.MemberIds.Count != 0);
×
1053
                case CardsCondition.GreaterThan:
1054
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
×
1055
                case CardsCondition.LessThan:
1056
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
×
1057
                case CardsCondition.GreaterThanOrEqual:
1058
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
×
1059
                case CardsCondition.LessThanOrEqual:
1060
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
×
1061
                case CardsCondition.Between:
1062
                {
1063
                    if (entry.ValueAsNumbers?.Count != 2)
×
1064
                    {
1065
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
1066
                    }
1067

1068
                    decimal from = entry.ValueAsNumbers.First();
×
1069
                    decimal to = entry.ValueAsNumbers.Last();
×
1070
                    cards = cards.Where(x => x.MemberIds.Count >= from);
×
1071
                    cards = cards.Where(x => x.MemberIds.Count <= to);
×
1072
                    return cards;
×
1073
                }
1074
                case CardsCondition.NotBetween:
1075
                {
1076
                    if (entry.ValueAsNumbers?.Count != 2)
×
1077
                    {
1078
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
1079
                    }
1080

1081
                    decimal from = entry.ValueAsNumbers.First();
×
1082
                    decimal to = entry.ValueAsNumbers.Last();
×
1083
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
1084
                    return cards;
×
1085
                }
1086
                case CardsCondition.Contains:
1087
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1088
                    {
1089
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Contains(y))); });
14✔
1090
                    }
1091

1092
                    return cards.Where(x => x.Members.Any(z => z.FullName.Contains(entry.ValueAsString)));
6✔
1093
                case CardsCondition.DoNotContains:
1094
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1095
                    {
1096
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.Contains(y))); });
14✔
1097
                    }
1098

1099
                    return cards.Where(x => x.Members.All(z => !z.FullName.Contains(entry.ValueAsString)));
6✔
1100
                case CardsCondition.RegEx:
1101
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1102
                    {
1103
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => Regex.IsMatch(z.FullName, y, RegexOptions.IgnoreCase))); });
14✔
1104
                    }
1105

1106
                    return cards.Where(x => x.Members.Any(z => Regex.IsMatch(z.FullName, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
1107
                case CardsCondition.StartsWith:
1108
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1109
                    {
1110
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1111
                    }
1112

1113
                    return cards.Where(x => x.Members.Any(z => z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1114
                case CardsCondition.DoNotStartWith:
1115
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1116
                    {
1117
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1118
                    }
1119

1120
                    return cards.Where(x => x.Members.All(z => !z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1121
                case CardsCondition.EndsWith:
1122
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1123
                    {
1124
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1125
                    }
1126

1127
                    return cards.Where(x => x.Members.Any(z => z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1128
                case CardsCondition.DoNotEndWith:
1129
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1130
                    {
1131
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1132
                    }
1133

1134
                    return cards.Where(x => x.Members.All(z => !z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1135
                default:
1136
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
1137
            }
1138
        }
1139

1140
        private static IEnumerable<Card> FilterName(IEnumerable<Card> cards, CardsFilterCondition entry)
1141
        {
1142
            switch (entry.Condition)
27!
1143
            {
1144
                case CardsCondition.Equal:
1145
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1146
                    {
1147
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1148
                    }
1149

1150
                    if (entry.ValueAsString != null)
1!
1151
                    {
1152
                        return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
4✔
1153
                    }
1154

1155
                    if (entry.ValueAsNumber.HasValue)
×
1156
                    {
1157
                        return cards.Where(x => x.Name?.Length == entry.ValueAsNumber);
×
1158
                    }
1159

1160
                    break;
1161
                case CardsCondition.NotEqual:
1162
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1163
                    {
1164
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1165
                    }
1166

1167
                    if (entry.ValueAsString != null)
2!
1168
                    {
1169
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Name));
5✔
1170
                    }
1171

1172
                    if (entry.ValueAsNumber.HasValue)
×
1173
                    {
1174
                        return cards.Where(x => x.Name?.Length != entry.ValueAsNumber);
×
1175
                    }
1176

1177
                    break;
1178
                case CardsCondition.GreaterThan:
1179
                    //Assume this means length of name
1180
                    if (entry.ValueAsNumber.HasValue)
×
1181
                    {
1182
                        return cards.Where(x => x.Name?.Length > entry.ValueAsNumber);
×
1183
                    }
1184

1185
                    break;
1186
                case CardsCondition.LessThan:
1187
                    //Assume this means length of name
1188
                    if (entry.ValueAsNumber.HasValue)
×
1189
                    {
1190
                        cards = cards.Where(x => x.Name?.Length < entry.ValueAsNumber);
×
1191
                    }
1192

1193
                    break;
×
1194
                case CardsCondition.GreaterThanOrEqual:
1195
                    //Assume this means length of name
1196
                    if (entry.ValueAsNumber.HasValue)
×
1197
                    {
1198
                        cards = cards.Where(x => x.Name?.Length >= entry.ValueAsNumber);
×
1199
                    }
1200

1201
                    break;
×
1202
                case CardsCondition.LessThanOrEqual:
1203
                    //Assume this means length of name
1204
                    if (entry.ValueAsNumber.HasValue)
×
1205
                    {
1206
                        cards = cards.Where(x => x.Name?.Length <= entry.ValueAsNumber);
×
1207
                    }
1208

1209
                    break;
×
1210
                case CardsCondition.HasAnyValue:
1211
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Name));
×
1212
                case CardsCondition.DoNotHaveAnyValue:
1213
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Name));
×
1214
                case CardsCondition.Contains:
1215
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1216
                    {
1217
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.Contains(y)));
9✔
1218
                    }
1219

1220
                    return cards.Where(x => x.Name.Contains(entry.ValueAsString));
4✔
1221

1222
                case CardsCondition.DoNotContains:
1223
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1224
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1225
                    {
1226
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Name.Contains(y)));
8✔
1227
                    }
1228

1229
                    return cards.Where(x => !x.Name.Contains(entry.ValueAsString));
4✔
1230

1231
                case CardsCondition.AnyOfThese:
1232
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1233
                    {
1234
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Name)));
18✔
1235
                    }
1236

1237
                    return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
8✔
1238

1239
                case CardsCondition.NoneOfThese:
1240
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1241
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1242
                    {
1243
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1244
                    }
1245

1246
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
45✔
1247

1248
                case CardsCondition.RegEx:
1249
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1250
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1251
                    {
1252
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Name, y, RegexOptions.IgnoreCase)));
18✔
1253
                    }
1254

1255
                    return cards.Where(x => Regex.IsMatch(x.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
1256

1257
                case CardsCondition.StartsWith:
1258
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1259
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1260
                    {
1261
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1262
                    }
1263

1264
                    return cards.Where(x => x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1265

1266
                case CardsCondition.EndsWith:
1267
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1268
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1269
                    {
1270
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1271
                    }
1272

1273
                    return cards.Where(x => x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1274

1275
                case CardsCondition.DoNotStartWith:
1276
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1277
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1278
                    {
1279
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
1280
                    }
1281

1282
                    return cards.Where(x => !x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1283

1284
                case CardsCondition.DoNotEndWith:
1285
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1286
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1287
                    {
1288
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1289
                    }
1290

1291
                    return cards.Where(x => !x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1292

1293
                default:
1294
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Name Condition");
×
1295
            }
1296

1297
            return cards;
×
1298
        }
1299

1300
        private static IEnumerable<Card> FilterDescription(IEnumerable<Card> cards, CardsFilterCondition entry)
1301
        {
1302
            switch (entry.Condition)
26!
1303
            {
1304
                case CardsCondition.Equal:
1305
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1306
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1307
                    {
1308
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1309
                    }
1310
                    else if (entry.ValueAsString != null)
2✔
1311
                    {
1312
                        return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1313
                    }
1314
                    else if (entry.ValueAsNumber.HasValue)
1!
1315
                    {
1316
                        return cards.Where(x => x.Description.Length == entry.ValueAsNumber);
4✔
1317
                    }
1318

1319
                    break;
1320
                case CardsCondition.NotEqual:
1321
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1322
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1323
                    {
1324
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1325
                    }
1326
                    else if (entry.ValueAsString != null)
2✔
1327
                    {
1328
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1329
                    }
1330
                    else if (entry.ValueAsNumber.HasValue)
1!
1331
                    {
1332
                        return cards.Where(x => x.Description.Length != entry.ValueAsNumber);
4✔
1333
                    }
1334

1335
                    break;
1336
                case CardsCondition.GreaterThan:
1337
                    //Assume this means length of Description
1338
                    if (entry.ValueAsNumber.HasValue)
×
1339
                    {
1340
                        return cards.Where(x => x.Description.Length > entry.ValueAsNumber);
×
1341
                    }
1342

1343
                    break;
1344
                case CardsCondition.LessThan:
1345
                    //Assume this means length of Description
1346
                    if (entry.ValueAsNumber.HasValue)
×
1347
                    {
1348
                        return cards.Where(x => x.Description.Length < entry.ValueAsNumber);
×
1349
                    }
1350

1351
                    break;
1352
                case CardsCondition.GreaterThanOrEqual:
1353
                    //Assume this means length of Description
1354
                    if (entry.ValueAsNumber.HasValue)
×
1355
                    {
1356
                        return cards.Where(x => x.Description.Length >= entry.ValueAsNumber);
×
1357
                    }
1358

1359
                    break;
1360
                case CardsCondition.LessThanOrEqual:
1361
                    //Assume this means length of Description
1362
                    if (entry.ValueAsNumber.HasValue)
×
1363
                    {
1364
                        return cards.Where(x => x.Description.Length <= entry.ValueAsNumber);
×
1365
                    }
1366

1367
                    break;
1368
                case CardsCondition.HasAnyValue:
1369
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Description));
×
1370
                case CardsCondition.DoNotHaveAnyValue:
1371
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Description));
×
1372
                case CardsCondition.Contains:
1373
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1374
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1375
                    {
1376
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.Contains(y)));
9✔
1377
                    }
1378

1379
                    return cards.Where(x => x.Description.Contains(entry.ValueAsString));
4✔
1380

1381
                case CardsCondition.DoNotContains:
1382
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1383
                    {
1384
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.Contains(y)));
8✔
1385
                    }
1386

1387
                    return cards.Where(x => !x.Description.Contains(entry.ValueAsString));
4✔
1388

1389
                case CardsCondition.AnyOfThese:
1390
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1391
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1392
                    {
1393
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Description)));
18✔
1394
                    }
1395

1396
                    return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
8✔
1397

1398
                case CardsCondition.AllOfThese:
1399
                {
1400
                    throw new TrelloApiException("AllOfThese on Description Filter does not make sense");
×
1401
                }
1402
                case CardsCondition.NoneOfThese:
1403
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1404
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1405
                    {
1406
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1407
                    }
1408

1409
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1410

1411
                case CardsCondition.RegEx:
1412
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1413
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1414
                    {
1415
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Description, y, RegexOptions.IgnoreCase)));
18✔
1416
                    }
1417

1418
                    return cards.Where(x => Regex.IsMatch(x.Description, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
1419

1420
                case CardsCondition.StartsWith:
1421
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1422
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1423
                    {
1424
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1425
                    }
1426

1427
                    return cards.Where(x => x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1428

1429
                case CardsCondition.EndsWith:
1430
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1431
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1432
                    {
1433
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1434
                    }
1435

1436
                    return cards.Where(x => x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1437

1438
                case CardsCondition.DoNotStartWith:
1439
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1440
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1441
                    {
1442
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
10✔
1443
                    }
1444

1445
                    return cards.Where(x => !x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1446

1447
                case CardsCondition.DoNotEndWith:
1448
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1449
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1450
                    {
1451
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1452
                    }
1453

1454
                    return cards.Where(x => !x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1455

1456
                default:
1457
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Description Condition");
×
1458
            }
1459

1460
            return cards;
×
1461
        }
1462
    }
1463
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc