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

rwjdk / TrelloDotNet / 13617669023

02 Mar 2025 05:20PM UTC coverage: 49.905% (+4.0%) from 45.939%
13617669023

push

github

rwjdk
Fixes + Increase new Filter Test Coverage

1297 of 3263 branches covered (39.75%)

Branch coverage included in aggregate %.

26 of 34 new or added lines in 1 file covered. (76.47%)

34 existing lines in 7 files now uncovered.

2903 of 5153 relevant lines covered (56.34%)

53.77 hits per line

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

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

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

71
            return cards.ToList();
81✔
72
        }
73

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

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

86
                case CardsCondition.Equal:
87
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
88
                    {
89
                        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✔
90
                    }
91

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

94
                case CardsCondition.AnyOfThese:
95

96
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
97
                    {
98
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
99
                    }
100

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

103
                case CardsCondition.NoneOfThese:
104
                case CardsCondition.NotEqual:
105
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
106
                    {
107
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
28✔
108
                    }
109

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

112
                case CardsCondition.DoNotHaveAnyValue:
113
                    return cards.Where(x => x.LabelIds.Count == 0);
×
114
                case CardsCondition.HasAnyValue:
115
                    return cards.Where(x => x.LabelIds.Count != 0);
×
116
                case CardsCondition.GreaterThan:
117
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
×
118
                case CardsCondition.LessThan:
119
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
×
120
                case CardsCondition.GreaterThanOrEqual:
121
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
×
122
                case CardsCondition.LessThanOrEqual:
123
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
×
124
                case CardsCondition.Between:
125
                {
126
                    if (entry.ValueAsNumbers?.Count != 2)
×
127
                    {
128
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
129
                    }
130

131
                    decimal from = entry.ValueAsNumbers.First();
×
132
                    decimal to = entry.ValueAsNumbers.Last();
×
133
                    cards = cards.Where(x => x.LabelIds.Count >= from);
×
134
                    cards = cards.Where(x => x.LabelIds.Count <= to);
×
135
                    return cards;
×
136
                }
137
                case CardsCondition.NotBetween:
138
                {
139
                    if (entry.ValueAsNumbers?.Count != 2)
×
140
                    {
141
                        throw new TrelloApiException("NotBetween 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 > to || x.LabelIds.Count < from);
×
147
                    return cards;
×
148
                }
149
                case CardsCondition.Contains:
150
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
151
                    {
152
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Contains(y))); });
16✔
153
                    }
154

155
                    return cards.Where(x => x.Labels.Any(z => z.Name.Contains(entry.ValueAsString)));
7✔
156
                case CardsCondition.DoNotContains:
157
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2!
158
                    {
NEW
159
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.Contains(y))); });
×
160
                    }
161

162
                    return cards.Where(x => x.Labels.All(z => !z.Name.Contains(entry.ValueAsString)));
14✔
163
                case CardsCondition.RegEx:
164
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
165
                    {
166
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => Regex.IsMatch(z.Name, y, RegexOptions.IgnoreCase))); });
12✔
167
                    }
168

169
                    return cards.Where(x => x.Labels.Any(z => Regex.IsMatch(z.Name, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
170
                case CardsCondition.StartsWith:
171
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
172
                    {
173
                        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✔
174
                    }
175

176
                    return cards.Where(x => x.Labels.Any(z => z.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
177
                case CardsCondition.DoNotStartWith:
178
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
179
                    {
180
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
181
                    }
182

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

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

197
                    return cards.Where(x => x.Labels.All(z => !z.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
7✔
198
                default:
199
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
200
            }
201
        }
202

203
        private static IEnumerable<Card> FilterListName(IEnumerable<Card> cards, CardsFilterCondition entry)
204
        {
205
            switch (entry.Condition)
24✔
206
            {
207
                case CardsCondition.AnyOfThese:
208
                case CardsCondition.Equal:
209
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
210
                    {
211
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
212
                    }
213

214
                    return cards.Where(x => x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
215
                case CardsCondition.NoneOfThese:
216
                case CardsCondition.NotEqual:
217
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
218
                    {
219
                        return cards.Where(x => entry.ValueAsStrings.All(y => !y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
220
                    }
221

222
                    return cards.Where(x => !x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
223
                case CardsCondition.Contains:
224
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
225
                    {
226
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.Contains(y)));
10✔
227
                    }
228

229
                    return cards.Where(x => x.List.Name.Contains(entry.ValueAsString));
4✔
230
                case CardsCondition.DoNotContains:
231
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
232
                    {
233
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.Contains(y)));
10✔
234
                    }
235

236
                    return cards.Where(x => !x.List.Name.Contains(entry.ValueAsString));
4✔
237
                case CardsCondition.RegEx:
238
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
239
                    {
240
                        return cards.Where(x => entry.ValueAsStrings.Any(y => Regex.IsMatch(x.List.Name, y, RegexOptions.IgnoreCase)));
7✔
241
                    }
242

243
                    return cards.Where(x => Regex.IsMatch(x.List.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
244
                case CardsCondition.StartsWith:
245
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
246
                    {
247
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
248
                    }
249

250
                    return cards.Where(x => x.List.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
251
                case CardsCondition.EndsWith:
252
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
253
                    {
254
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
255
                    }
256

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

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

271
                    return cards.Where(x => !x.List.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
272
                default:
273
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
274
            }
275
        }
276

277
        private static IEnumerable<Card> FilterDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
278
        {
279
            switch (entry.Condition)
×
280
            {
281
                case CardsCondition.Equal:
282
                    return cards.Where(x => x.DueComplete == entry.ValueAsBoolean);
×
283
                case CardsCondition.NotEqual:
284
                    return cards.Where(x => x.DueComplete != entry.ValueAsBoolean);
×
285
                default:
286
                    throw new TrelloApiException($"{entry.Condition} on DueComplete Filter does not make sense");
×
287
            }
288
        }
289

290
        private static IEnumerable<Card> FilterCustomField(IEnumerable<Card> cards, CardsFilterCondition entry)
291
        {
292
            if (entry.CustomFieldEntry == null)
×
293
            {
294
                throw new TrelloApiException("CustomField was not provided");
×
295
            }
296

297
            var customFieldDefinition = entry.CustomFieldEntry;
×
298

299
            cards = cards.Where(x =>
×
300
            {
×
301
                CustomFieldItem customFieldItem = x.CustomFieldItems.FirstOrDefault(y => y.CustomFieldId == customFieldDefinition.Id);
×
302
                switch (entry.Condition)
×
303
                {
×
304
                    case CardsCondition.HasAnyValue:
×
305
                        return customFieldItem != null;
×
306
                    case CardsCondition.DoNotHaveAnyValue:
×
307
                        return customFieldItem == null;
×
308
                }
×
309

×
310
                switch (customFieldDefinition.Type)
×
311
                {
×
312
                    case CustomFieldType.Checkbox:
×
313
                        var @checked = customFieldItem?.Value.Checked ?? false;
×
314
                        switch (entry.Condition)
×
315
                        {
×
316
                            case CardsCondition.Equal:
×
317
                                return @checked == entry.ValueAsBoolean;
×
318
                            case CardsCondition.NotEqual:
×
319
                                return @checked != entry.ValueAsBoolean;
×
320
                            default:
×
321
                                throw new TrelloApiException($"Custom Field of Type Checkbox can't use Condition '{entry.Condition}'");
×
322
                        }
×
323
                    case CustomFieldType.Date:
×
324
                        var date = customFieldItem?.Value.Date;
×
325
                        switch (entry.Condition)
×
326
                        {
×
327
                            case CardsCondition.Equal:
×
328
                                return date.HasValue && date.Value == entry.ValueAsDateTimeOffset;
×
329
                            case CardsCondition.NotEqual:
×
330
                                return !date.HasValue || date.Value != entry.ValueAsDateTimeOffset;
×
331
                            case CardsCondition.GreaterThan:
×
332
                                return date.HasValue && date.Value > entry.ValueAsDateTimeOffset;
×
333
                            case CardsCondition.LessThan:
×
334
                                return date.HasValue && date.Value < entry.ValueAsDateTimeOffset;
×
335
                            case CardsCondition.GreaterThanOrEqual:
×
336
                                return date.HasValue && date.Value >= entry.ValueAsDateTimeOffset;
×
337
                            case CardsCondition.LessThanOrEqual:
×
338
                                return date.HasValue && date.Value <= entry.ValueAsDateTimeOffset;
×
339
                            case CardsCondition.AnyOfThese:
×
340
                                return date.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == date.Value);
×
341
                            case CardsCondition.NoneOfThese:
×
342
                                return date.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != date.Value);
×
343
                            case CardsCondition.Between:
×
344
                            {
×
345
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
346
                                {
×
347
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Dates");
×
348
                                }
×
349

×
350
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
351
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
352
                                return date.HasValue && date.Value >= from && date.Value <= to;
×
353
                            }
×
354
                            case CardsCondition.NotBetween:
×
355
                            {
×
356
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
357
                                {
×
358
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Dates");
×
359
                                }
×
360

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

×
433
                                decimal from = entry.ValueAsNumbers.First();
×
434
                                decimal to = entry.ValueAsNumbers.Last();
×
435
                                return number >= from && number <= to;
×
436
                            }
×
437
                            case CardsCondition.NotBetween:
×
438
                            {
×
439
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
440
                                {
×
441
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Numbers");
×
442
                                }
×
443

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

493
            return cards;
×
494
        }
495

496
        private static IEnumerable<Card> FilterDueDate(IEnumerable<Card> cards, CardsFilterCondition entry)
497
        {
498
            switch (entry.Condition)
×
499
            {
500
                case CardsCondition.Equal:
501
                    return cards.Where(x => x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
502
                case CardsCondition.NotEqual:
503
                    return cards.Where(x => x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
504
                case CardsCondition.GreaterThan:
505
                    return cards.Where(x => x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
506
                case CardsCondition.LessThan:
507
                    return cards.Where(x => x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
508
                case CardsCondition.GreaterThanOrEqual:
509
                    return cards.Where(x => x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
510
                case CardsCondition.LessThanOrEqual:
511
                    return cards.Where(x => x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
512

513
                case CardsCondition.Between:
514
                {
515
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
516
                    {
517
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
518
                    }
519

520
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
521
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
522
                    cards = cards.Where(x => x.Due.HasValue && x.Due >= from);
×
523
                    cards = cards.Where(x => x.Due.HasValue && x.Due <= to);
×
524
                    return cards;
×
525
                }
526
                case CardsCondition.NotBetween:
527
                {
528
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
529
                    {
530
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
531
                    }
532

533
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
534
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
535
                    cards = cards.Where(x => x.Due.HasValue && x.Due > to || x.Due < from);
×
536
                    return cards;
×
537
                }
538

539
                case CardsCondition.HasAnyValue:
540
                    return cards.Where(x => x.Due.HasValue);
×
541
                case CardsCondition.DoNotHaveAnyValue:
542
                    return cards.Where(x => !x.Due.HasValue);
×
543
                case CardsCondition.AnyOfThese:
544
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
545
                case CardsCondition.NoneOfThese:
546
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
547
                default:
548
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
549
            }
550
        }
551

552
        private static IEnumerable<Card> FilterDueDateNoDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
553
        {
554
            switch (entry.Condition)
×
555
            {
556
                case CardsCondition.Equal:
557
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
558
                case CardsCondition.NotEqual:
559
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
560
                case CardsCondition.GreaterThan:
561
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
562
                case CardsCondition.LessThan:
563
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
564
                case CardsCondition.GreaterThanOrEqual:
565
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
566
                case CardsCondition.LessThanOrEqual:
567
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
568

569
                case CardsCondition.Between:
570
                {
571
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
572
                    {
573
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
574
                    }
575

576
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
577
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
578
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= from);
×
579
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= to);
×
580
                    return cards;
×
581
                }
582
                case CardsCondition.NotBetween:
583
                {
584
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
585
                    {
586
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
587
                    }
588

589
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
590
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
591
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > to || x.Due < from);
×
592
                    return cards;
×
593
                }
594

595
                case CardsCondition.HasAnyValue:
596
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue);
×
597
                case CardsCondition.DoNotHaveAnyValue:
598
                    return cards.Where(x => !x.Due.HasValue);
×
599
                case CardsCondition.AnyOfThese:
600
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
601
                case CardsCondition.NoneOfThese:
602
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
603
                default:
604
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
605
            }
606
        }
607

608
        private static IEnumerable<Card> FilterCreateDate(IEnumerable<Card> cards, CardsFilterCondition entry)
609
        {
610
            switch (entry.Condition)
×
611
            {
612
                case CardsCondition.Equal:
613
                    return cards.Where(x => x.Created.HasValue && x.Created == entry.ValueAsDateTimeOffset);
×
614
                case CardsCondition.NotEqual:
615
                    return cards.Where(x => x.Created.HasValue && x.Created != entry.ValueAsDateTimeOffset);
×
616
                case CardsCondition.GreaterThan:
617
                    return cards.Where(x => x.Created.HasValue && x.Created > entry.ValueAsDateTimeOffset);
×
618
                case CardsCondition.LessThan:
619
                    return cards.Where(x => x.Created.HasValue && x.Created < entry.ValueAsDateTimeOffset);
×
620
                case CardsCondition.GreaterThanOrEqual:
621
                    return cards.Where(x => x.Created.HasValue && x.Created >= entry.ValueAsDateTimeOffset);
×
622
                case CardsCondition.LessThanOrEqual:
623
                    return cards.Where(x => x.Created.HasValue && x.Created <= entry.ValueAsDateTimeOffset);
×
624
                case CardsCondition.Between:
625
                {
626
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
627
                    {
628
                        throw new TrelloApiException("Between Condition for Created Date need 2 and only 2 Dates");
×
629
                    }
630

631
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
632
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
633
                    cards = cards.Where(x => x.Created.HasValue && x.Created >= from);
×
634
                    cards = cards.Where(x => x.Created.HasValue && x.Created <= to);
×
635
                    return cards;
×
636
                }
637
                case CardsCondition.NotBetween:
638
                {
639
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
640
                    {
641
                        throw new TrelloApiException("NotBetween Condition for Created Date need 2 and only 2 Dates");
×
642
                    }
643

644
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
645
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
646
                    cards = cards.Where(x => x.Created.HasValue && x.Created > to || x.Created < from);
×
647
                    return cards;
×
648
                }
649
                case CardsCondition.AnyOfThese:
650
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.Any(y => x.Created != null && y == x.Created.Value));
×
651
                case CardsCondition.NoneOfThese:
652
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.All(y => x.Created != null && y != x.Created.Value));
×
653
                default:
654
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterCreateDate");
×
655
            }
656
        }
657

658
        private static IEnumerable<Card> FilterStartDate(IEnumerable<Card> cards, CardsFilterCondition entry)
659
        {
660
            switch (entry.Condition)
×
661
            {
662
                case CardsCondition.Equal:
663
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date == entry.ValueAsDateTimeOffset.Value.Date);
×
664
                case CardsCondition.NotEqual:
665
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date != entry.ValueAsDateTimeOffset.Value.Date);
×
666
                case CardsCondition.GreaterThan:
667
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date > entry.ValueAsDateTimeOffset.Value.Date);
×
668
                case CardsCondition.LessThan:
669
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date < entry.ValueAsDateTimeOffset.Value.Date);
×
670
                case CardsCondition.GreaterThanOrEqual:
671
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date >= entry.ValueAsDateTimeOffset.Value.Date);
×
672
                case CardsCondition.LessThanOrEqual:
673
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date <= entry.ValueAsDateTimeOffset.Value.Date);
×
674
                case CardsCondition.Between:
675
                {
676
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
677
                    {
678
                        throw new TrelloApiException("Between Condition for Start Date need 2 and only 2 Dates");
×
679
                    }
680

681
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
682
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
683
                    cards = cards.Where(x => x.Start.HasValue && x.Start >= from);
×
684
                    cards = cards.Where(x => x.Start.HasValue && x.Start <= to);
×
685
                    return cards;
×
686
                }
687
                case CardsCondition.NotBetween:
688
                {
689
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
690
                    {
691
                        throw new TrelloApiException("NotBetween Condition for Start Date need 2 and only 2 Dates");
×
692
                    }
693

694
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
695
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
696
                    cards = cards.Where(x => x.Start.HasValue && x.Start > to || x.Start < from);
×
697
                    return cards;
×
698
                }
699
                case CardsCondition.HasAnyValue:
700
                    return cards.Where(x => x.Start.HasValue);
×
701
                case CardsCondition.DoNotHaveAnyValue:
702
                    return cards.Where(x => !x.Start.HasValue);
×
703
                case CardsCondition.AnyOfThese:
704
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y.Date == x.Start.Value.Date));
×
705
                case CardsCondition.NoneOfThese:
706
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.All(y => y.Date != x.Start.Value.Date));
×
707
                default:
708
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterStartDate");
×
709
            }
710
        }
711

712
        private static IEnumerable<Card> FilterListId(IEnumerable<Card> cards, CardsFilterCondition entry)
713
        {
714
            switch (entry.Condition)
10✔
715
            {
716
                case CardsCondition.AnyOfThese:
717
                case CardsCondition.Equal:
718
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
719
                    {
720
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y == x.ListId));
18✔
721
                    }
722

723
                    return cards.Where(x => x.ListId == entry.ValueAsString);
8✔
724
                case CardsCondition.NoneOfThese:
725
                case CardsCondition.NotEqual:
726
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
727
                    {
728
                        return cards.Where(x => entry.ValueAsStrings.All(y => y != x.ListId));
18✔
729
                    }
730

731
                    return cards.Where(x => x.ListId != entry.ValueAsString);
8✔
732
                default:
733
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
734
            }
735
        }
736

737
        private static IEnumerable<Card> FilterLabelId(IEnumerable<Card> cards, CardsFilterCondition entry)
738
        {
739
            switch (entry.Condition)
10!
740
            {
741
                case CardsCondition.AllOfThese:
742
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
743
                    {
744
                        return cards.Where(x => entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
8✔
745
                    }
746

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

749
                case CardsCondition.Equal:
750
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
751
                    {
752
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
6✔
753
                    }
754

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

757
                case CardsCondition.AnyOfThese:
758
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
759
                    {
760
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
9✔
761
                    }
762

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

765
                case CardsCondition.NoneOfThese:
766
                case CardsCondition.NotEqual:
767
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
768
                    {
769
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
20✔
770
                    }
771

772
                    return cards.Where(x => !x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
8✔
773
                case CardsCondition.DoNotHaveAnyValue:
774
                    return cards.Where(x => x.LabelIds.Count == 0);
×
775
                case CardsCondition.HasAnyValue:
776
                    return cards.Where(x => x.LabelIds.Count != 0);
×
777
                case CardsCondition.GreaterThan:
778
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
×
779
                case CardsCondition.LessThan:
780
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
×
781
                case CardsCondition.GreaterThanOrEqual:
782
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
×
783
                case CardsCondition.LessThanOrEqual:
784
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
×
785
                case CardsCondition.Between:
786
                {
787
                    if (entry.ValueAsNumbers?.Count != 2)
×
788
                    {
789
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
790
                    }
791

792
                    decimal from = entry.ValueAsNumbers.First();
×
793
                    decimal to = entry.ValueAsNumbers.Last();
×
794
                    cards = cards.Where(x => x.LabelIds.Count >= from);
×
795
                    cards = cards.Where(x => x.LabelIds.Count <= to);
×
796
                    return cards;
×
797
                }
798
                case CardsCondition.NotBetween:
799
                {
800
                    if (entry.ValueAsNumbers?.Count != 2)
×
801
                    {
802
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
803
                    }
804

805
                    decimal from = entry.ValueAsNumbers.First();
×
806
                    decimal to = entry.ValueAsNumbers.Last();
×
807
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
×
808
                    return cards;
×
809
                }
810
                default:
811
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
812
            }
813
        }
814

815
        private static IEnumerable<Card> FilterMemberId(IEnumerable<Card> cards, CardsFilterCondition entry)
816
        {
817
            switch (entry.Condition)
5!
818
            {
819
                case CardsCondition.AllOfThese:
820
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
821
                    {
822
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
823
                    }
824

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

827
                case CardsCondition.Equal:
828
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
829
                    {
830
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
831
                    }
832

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

835
                case CardsCondition.AnyOfThese:
836

837
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
838
                    {
839
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
840
                    }
841

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

844
                case CardsCondition.NoneOfThese:
845
                case CardsCondition.NotEqual:
846
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2!
847
                    {
848
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
849
                    }
850

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

853
                case CardsCondition.DoNotHaveAnyValue:
854
                    return cards.Where(x => x.MemberIds.Count == 0);
×
855
                case CardsCondition.HasAnyValue:
856
                    return cards.Where(x => x.MemberIds.Count != 0);
×
857
                case CardsCondition.GreaterThan:
858
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
×
859
                case CardsCondition.LessThan:
860
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
×
861
                case CardsCondition.GreaterThanOrEqual:
862
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
×
863
                case CardsCondition.LessThanOrEqual:
864
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
×
865
                case CardsCondition.Between:
866
                {
867
                    if (entry.ValueAsNumbers?.Count != 2)
×
868
                    {
869
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
870
                    }
871

872
                    decimal from = entry.ValueAsNumbers.First();
×
873
                    decimal to = entry.ValueAsNumbers.Last();
×
874
                    cards = cards.Where(x => x.MemberIds.Count >= from);
×
875
                    cards = cards.Where(x => x.MemberIds.Count <= to);
×
876
                    return cards;
×
877
                }
878
                case CardsCondition.NotBetween:
879
                {
880
                    if (entry.ValueAsNumbers?.Count != 2)
×
881
                    {
882
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
883
                    }
884

885
                    decimal from = entry.ValueAsNumbers.First();
×
886
                    decimal to = entry.ValueAsNumbers.Last();
×
887
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
888
                    return cards;
×
889
                }
890
                default:
891
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
892
            }
893
        }
894

895
        private static IEnumerable<Card> FilterMemberName(IEnumerable<Card> cards, CardsFilterCondition entry)
896
        {
897
            switch (entry.Condition)
12!
898
            {
899
                case CardsCondition.AllOfThese:
900
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
901
                    {
902
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
×
903
                    }
904

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

907
                case CardsCondition.Equal:
908
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
909
                    {
910
                        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))); });
×
911
                    }
912

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

915
                case CardsCondition.AnyOfThese:
916

917
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
918
                    {
919
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
×
920
                    }
921

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

924
                case CardsCondition.NoneOfThese:
925
                case CardsCondition.NotEqual:
926
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2!
927
                    {
928
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
×
929
                    }
930

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

933
                case CardsCondition.DoNotHaveAnyValue:
934
                    return cards.Where(x => x.MemberIds.Count == 0);
×
935
                case CardsCondition.HasAnyValue:
936
                    return cards.Where(x => x.MemberIds.Count != 0);
×
937
                case CardsCondition.GreaterThan:
938
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
×
939
                case CardsCondition.LessThan:
940
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
×
941
                case CardsCondition.GreaterThanOrEqual:
942
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
×
943
                case CardsCondition.LessThanOrEqual:
944
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
×
945
                case CardsCondition.Between:
946
                {
947
                    if (entry.ValueAsNumbers?.Count != 2)
×
948
                    {
949
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
950
                    }
951

952
                    decimal from = entry.ValueAsNumbers.First();
×
953
                    decimal to = entry.ValueAsNumbers.Last();
×
954
                    cards = cards.Where(x => x.MemberIds.Count >= from);
×
955
                    cards = cards.Where(x => x.MemberIds.Count <= to);
×
956
                    return cards;
×
957
                }
958
                case CardsCondition.NotBetween:
959
                {
960
                    if (entry.ValueAsNumbers?.Count != 2)
×
961
                    {
962
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
963
                    }
964

965
                    decimal from = entry.ValueAsNumbers.First();
×
966
                    decimal to = entry.ValueAsNumbers.Last();
×
967
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
968
                    return cards;
×
969
                }
970
                case CardsCondition.Contains:
971
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
972
                    {
NEW
973
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Contains(y))); });
×
974
                    }
975

976
                    return cards.Where(x => x.Members.Any(z => z.FullName.Contains(entry.ValueAsString)));
6✔
977
                case CardsCondition.DoNotContains:
978
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
979
                    {
NEW
980
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.Contains(y))); });
×
981
                    }
982

983
                    return cards.Where(x => x.Members.All(z => !z.FullName.Contains(entry.ValueAsString)));
6✔
984
                case CardsCondition.RegEx:
985
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
986
                    {
NEW
987
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => Regex.IsMatch(z.FullName, y, RegexOptions.IgnoreCase))); });
×
988
                    }
989

990
                    return cards.Where(x => x.Members.Any(z => Regex.IsMatch(z.FullName, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
991
                case CardsCondition.StartsWith:
992
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
993
                    {
NEW
994
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
×
995
                    }
996

997
                    return cards.Where(x => x.Members.Any(z => z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
998
                case CardsCondition.DoNotStartWith:
999
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1000
                    {
NEW
1001
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
×
1002
                    }
1003

1004
                    return cards.Where(x => x.Members.All(z => !z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1005
                case CardsCondition.EndsWith:
1006
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1007
                    {
NEW
1008
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
×
1009
                    }
1010

1011
                    return cards.Where(x => x.Members.Any(z => z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1012
                case CardsCondition.DoNotEndWith:
1013
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1014
                    {
NEW
1015
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
×
1016
                    }
1017

1018
                    return cards.Where(x => x.Members.All(z => !z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1019
                default:
1020
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
1021
            }
1022
        }
1023

1024
        private static IEnumerable<Card> FilterName(IEnumerable<Card> cards, CardsFilterCondition entry)
1025
        {
1026
            switch (entry.Condition)
×
1027
            {
1028
                case CardsCondition.Equal:
1029
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1030
                    {
1031
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
1032
                    }
1033

1034
                    if (entry.ValueAsString != null)
×
1035
                    {
1036
                        return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
1037
                    }
1038

1039
                    if (entry.ValueAsNumber.HasValue)
×
1040
                    {
1041
                        return cards.Where(x => x.Name?.Length == entry.ValueAsNumber);
×
1042
                    }
1043

1044
                    break;
1045
                case CardsCondition.NotEqual:
1046
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1047
                    {
1048
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
1049
                    }
1050

1051
                    if (entry.ValueAsString != null)
×
1052
                    {
1053
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Name));
×
1054
                    }
1055

1056
                    if (entry.ValueAsNumber.HasValue)
×
1057
                    {
1058
                        return cards.Where(x => x.Name?.Length != entry.ValueAsNumber);
×
1059
                    }
1060

1061
                    break;
1062
                case CardsCondition.GreaterThan:
1063
                    //Assume this means length of name
1064
                    if (entry.ValueAsNumber.HasValue)
×
1065
                    {
1066
                        return cards.Where(x => x.Name?.Length > entry.ValueAsNumber);
×
1067
                    }
1068

1069
                    break;
1070
                case CardsCondition.LessThan:
1071
                    //Assume this means length of name
1072
                    if (entry.ValueAsNumber.HasValue)
×
1073
                    {
1074
                        cards = cards.Where(x => x.Name?.Length < entry.ValueAsNumber);
×
1075
                    }
1076

1077
                    break;
×
1078
                case CardsCondition.GreaterThanOrEqual:
1079
                    //Assume this means length of name
1080
                    if (entry.ValueAsNumber.HasValue)
×
1081
                    {
1082
                        cards = cards.Where(x => x.Name?.Length >= entry.ValueAsNumber);
×
1083
                    }
1084

1085
                    break;
×
1086
                case CardsCondition.LessThanOrEqual:
1087
                    //Assume this means length of name
1088
                    if (entry.ValueAsNumber.HasValue)
×
1089
                    {
1090
                        cards = cards.Where(x => x.Name?.Length <= entry.ValueAsNumber);
×
1091
                    }
1092

1093
                    break;
×
1094
                case CardsCondition.HasAnyValue:
1095
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Name));
×
1096
                case CardsCondition.DoNotHaveAnyValue:
1097
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Name));
×
1098
                case CardsCondition.Contains:
1099
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1100
                    {
1101
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.Contains(y)));
×
1102
                    }
1103

1104
                    return cards.Where(x => x.Name.Contains(entry.ValueAsString));
×
1105

1106
                case CardsCondition.DoNotContains:
1107
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1108
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1109
                    {
1110
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Name.Contains(y)));
×
1111
                    }
1112

1113
                    return cards.Where(x => !x.Name.Contains(entry.ValueAsString));
×
1114

1115
                case CardsCondition.AnyOfThese:
1116
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1117
                    {
1118
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Name)));
×
1119
                    }
1120

1121
                    return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
1122

1123
                case CardsCondition.NoneOfThese:
1124
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1125
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1126
                    {
1127
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
1128
                    }
1129

1130
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
1131

1132
                case CardsCondition.RegEx:
1133
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1134
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1135
                    {
1136
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Name, y, RegexOptions.IgnoreCase)));
×
1137
                    }
1138

1139
                    return cards.Where(x => Regex.IsMatch(x.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
×
1140

1141
                case CardsCondition.StartsWith:
1142
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1143
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1144
                    {
1145
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1146
                    }
1147

1148
                    return cards.Where(x => x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1149

1150
                case CardsCondition.EndsWith:
1151
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1152
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1153
                    {
1154
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1155
                    }
1156

1157
                    return cards.Where(x => x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1158

1159
                case CardsCondition.DoNotStartWith:
1160
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1161
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1162
                    {
1163
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1164
                    }
1165

1166
                    return cards.Where(x => !x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1167

1168
                case CardsCondition.DoNotEndWith:
1169
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1170
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1171
                    {
1172
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1173
                    }
1174

1175
                    return cards.Where(x => !x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1176

1177
                default:
1178
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Name Condition");
×
1179
            }
1180

1181
            return cards;
×
1182
        }
1183

1184
        private static IEnumerable<Card> FilterDescription(IEnumerable<Card> cards, CardsFilterCondition entry)
1185
        {
1186
            switch (entry.Condition)
×
1187
            {
1188
                case CardsCondition.Equal:
1189
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1190
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1191
                    {
1192
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
1193
                    }
1194
                    else if (entry.ValueAsString != null)
×
1195
                    {
1196
                        return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
1197
                    }
1198
                    else if (entry.ValueAsNumber.HasValue)
×
1199
                    {
1200
                        return cards.Where(x => x.Description.Length == entry.ValueAsNumber);
×
1201
                    }
1202

1203
                    break;
1204
                case CardsCondition.NotEqual:
1205
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1206
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1207
                    {
1208
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
1209
                    }
1210
                    else if (entry.ValueAsString != null)
×
1211
                    {
1212
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
1213
                    }
1214
                    else if (entry.ValueAsNumber.HasValue)
×
1215
                    {
1216
                        return cards.Where(x => x.Description.Length != entry.ValueAsNumber);
×
1217
                    }
1218

1219
                    break;
1220
                case CardsCondition.GreaterThan:
1221
                    //Assume this means length of Description
1222
                    if (entry.ValueAsNumber.HasValue)
×
1223
                    {
1224
                        return cards.Where(x => x.Description.Length > entry.ValueAsNumber);
×
1225
                    }
1226

1227
                    break;
1228
                case CardsCondition.LessThan:
1229
                    //Assume this means length of Description
1230
                    if (entry.ValueAsNumber.HasValue)
×
1231
                    {
1232
                        return cards.Where(x => x.Description.Length < entry.ValueAsNumber);
×
1233
                    }
1234

1235
                    break;
1236
                case CardsCondition.GreaterThanOrEqual:
1237
                    //Assume this means length of Description
1238
                    if (entry.ValueAsNumber.HasValue)
×
1239
                    {
1240
                        return cards.Where(x => x.Description.Length >= entry.ValueAsNumber);
×
1241
                    }
1242

1243
                    break;
1244
                case CardsCondition.LessThanOrEqual:
1245
                    //Assume this means length of Description
1246
                    if (entry.ValueAsNumber.HasValue)
×
1247
                    {
1248
                        return cards.Where(x => x.Description.Length <= entry.ValueAsNumber);
×
1249
                    }
1250

1251
                    break;
1252
                case CardsCondition.HasAnyValue:
1253
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Description));
×
1254
                case CardsCondition.DoNotHaveAnyValue:
1255
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Description));
×
1256
                case CardsCondition.Contains:
1257
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1258
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1259
                    {
1260
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.Contains(y)));
×
1261
                    }
1262

1263
                    return cards.Where(x => x.Description.Contains(entry.ValueAsString));
×
1264

1265
                case CardsCondition.DoNotContains:
1266
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1267
                    {
1268
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.Contains(y)));
×
1269
                    }
1270

1271
                    return cards.Where(x => !x.Description.Contains(entry.ValueAsString));
×
1272

1273
                case CardsCondition.AnyOfThese:
1274
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1275
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1276
                    {
1277
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Description)));
×
1278
                    }
1279

1280
                    return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
1281

1282
                case CardsCondition.AllOfThese:
1283
                {
1284
                    throw new TrelloApiException("AllOfThese on Description Filter does not make sense");
×
1285
                }
1286
                case CardsCondition.NoneOfThese:
1287
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1288
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1289
                    {
1290
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
1291
                    }
1292

1293
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
1294

1295
                case CardsCondition.RegEx:
1296
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1297
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1298
                    {
1299
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Description, y, RegexOptions.IgnoreCase)));
×
1300
                    }
1301

1302
                    return cards.Where(x => Regex.IsMatch(x.Description, entry.ValueAsString, RegexOptions.IgnoreCase));
×
1303

1304
                case CardsCondition.StartsWith:
1305
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1306
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1307
                    {
1308
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1309
                    }
1310

1311
                    return cards.Where(x => x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1312

1313
                case CardsCondition.EndsWith:
1314
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1315
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1316
                    {
1317
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1318
                    }
1319

1320
                    return cards.Where(x => x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1321

1322
                case CardsCondition.DoNotStartWith:
1323
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1324
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1325
                    {
1326
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1327
                    }
1328

1329
                    return cards.Where(x => !x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1330

1331
                case CardsCondition.DoNotEndWith:
1332
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1333
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
1334
                    {
1335
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1336
                    }
1337

1338
                    return cards.Where(x => !x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
1339

1340
                default:
1341
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Description Condition");
×
1342
            }
1343

1344
            return cards;
×
1345
        }
1346
    }
1347
}
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

© 2026 Coveralls, Inc