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

rwjdk / TrelloDotNet / 13163656973

05 Feb 2025 06:02PM UTC coverage: 45.486% (-2.7%) from 48.162%
13163656973

push

github

rwjdk
WIP

942 of 2803 branches covered (33.61%)

Branch coverage included in aggregate %.

1 of 456 new or added lines in 6 files covered. (0.22%)

11 existing lines in 4 files now uncovered.

2444 of 4641 relevant lines covered (52.66%)

42.53 hits per line

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

0.0
/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, List<CardsFilterCondition> conditions)
21
        {
22
            foreach (CardsFilterCondition entry in conditions)
×
23
            {
24
                switch (entry.Field)
×
25
                {
26
                    case CardsConditionField.Name:
27
                        cards = FilterName(cards, entry);
×
28
                        break;
×
29
                    case CardsConditionField.List:
30
                        cards = FilterList(cards, entry);
×
31
                        break;
×
32
                    case CardsConditionField.Label:
33
                        cards = FilterLabel(cards, entry);
×
34
                        break;
×
35
                    case CardsConditionField.Member:
36
                        cards = FilterMember(cards, entry);
×
37
                        break;
×
38
                    case CardsConditionField.Description:
39
                        cards = FilterDescription(cards, entry);
×
40
                        break;
×
41
                    case CardsConditionField.DueWithNoDueComplete:
NEW
42
                        cards = FilterDueDateNoDueComplete(cards, entry);
×
NEW
43
                        break;
×
44
                    case CardsConditionField.Due:
45
                        cards = FilterDueDate(cards, entry);
×
46
                        break;
×
47
                    case CardsConditionField.Start:
48
                        cards = FilterStartDate(cards, entry);
×
49
                        break;
×
50
                    case CardsConditionField.Created:
51
                        cards = FilterCreateDate(cards, entry);
×
52
                        break;
×
53
                    case CardsConditionField.CustomField:
NEW
54
                        cards = FilterCustomField(cards, entry);
×
NEW
55
                        break;
×
56
                    case CardsConditionField.DueComplete:
NEW
57
                        cards = FilterDueComplete(cards, entry);
×
58
                        break;
59
                }
60
            }
61

62
            return cards.ToList();
×
63
        }
64

65
        private static IEnumerable<Card> FilterDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
66
        {
NEW
67
            switch (entry.Condition)
×
68
            {
69
                case CardsCondition.Equal:
NEW
70
                    return cards.Where(x => x.DueComplete == entry.ValueAsBoolean);
×
71
                case CardsCondition.NotEqual:
NEW
72
                    return cards.Where(x => x.DueComplete != entry.ValueAsBoolean);
×
73
                default:
NEW
74
                    throw new TrelloApiException($"{entry.Condition} on DueComplete Filter does not make sense");
×
75
            }
76
        }
77

78
        private static IEnumerable<Card> FilterCustomField(IEnumerable<Card> cards, CardsFilterCondition entry)
79
        {
NEW
80
            if (entry.CustomFieldEntry == null)
×
81
            {
NEW
82
                throw new TrelloApiException("CustomField was not provided");
×
83
            }
84

NEW
85
            var customFieldDefinition = entry.CustomFieldEntry;
×
86

87
            cards = cards.Where(x =>
×
88
            {
×
NEW
89
                CustomFieldItem customFieldItem = x.CustomFieldItems.FirstOrDefault(y => y.CustomFieldId == customFieldDefinition.Id);
×
90
                switch (entry.Condition)
×
91
                {
×
92
                    case CardsCondition.HasAnyValue:
×
93
                        return customFieldItem != null;
×
94
                    case CardsCondition.DoNotHaveAnyValue:
×
95
                        return customFieldItem == null;
×
96
                }
×
97

×
98
                switch (customFieldDefinition.Type)
×
99
                {
×
100
                    case CustomFieldType.Checkbox:
×
101
                        var @checked = customFieldItem?.Value.Checked ?? false;
×
102
                        switch (entry.Condition)
×
103
                        {
×
104
                            case CardsCondition.Equal:
×
105
                                return @checked == entry.ValueAsBoolean;
×
106
                            case CardsCondition.NotEqual:
×
107
                                return @checked != entry.ValueAsBoolean;
×
108
                            default:
×
109
                                throw new TrelloApiException($"Custom Field of Type Checkbox can't use Condition '{entry.Condition}'");
×
110
                        }
×
111
                    case CustomFieldType.Date:
×
112
                        var date = customFieldItem?.Value.Date;
×
113
                        switch (entry.Condition)
×
114
                        {
×
115
                            case CardsCondition.Equal:
×
116
                                return date.HasValue && date.Value == entry.ValueAsDateTimeOffset;
×
117
                            case CardsCondition.NotEqual:
×
118
                                return !date.HasValue || date.Value != entry.ValueAsDateTimeOffset;
×
119
                            case CardsCondition.GreaterThan:
×
120
                                return date.HasValue && date.Value > entry.ValueAsDateTimeOffset;
×
121
                            case CardsCondition.LessThan:
×
122
                                return date.HasValue && date.Value < entry.ValueAsDateTimeOffset;
×
123
                            case CardsCondition.GreaterThanOrEqual:
×
124
                                return date.HasValue && date.Value >= entry.ValueAsDateTimeOffset;
×
125
                            case CardsCondition.LessThanOrEqual:
×
126
                                return date.HasValue && date.Value <= entry.ValueAsDateTimeOffset;
×
127
                            case CardsCondition.AnyOfThese:
×
128
                                return date.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == date.Value);
×
129
                            case CardsCondition.NoneOfThese:
×
130
                                return date.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != date.Value);
×
NEW
131
                            case CardsCondition.Between:
×
NEW
132
                            {
×
NEW
133
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
NEW
134
                                {
×
NEW
135
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Dates");
×
NEW
136
                                }
×
NEW
137

×
NEW
138
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
139
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
140
                                return date.HasValue && date.Value >= from && date.Value <= to;
×
NEW
141
                            }
×
NEW
142
                            case CardsCondition.NotBetween:
×
NEW
143
                            {
×
NEW
144
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
NEW
145
                                {
×
NEW
146
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Dates");
×
NEW
147
                                }
×
NEW
148

×
NEW
149
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
150
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
151
                                return (date.HasValue && date.Value > to) || (date.HasValue && date.Value < from);
×
NEW
152
                            }
×
153
                            default:
×
154
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Date");
×
155
                        }
×
156
                    case CustomFieldType.List:
×
157
                        string listValue = customFieldDefinition.Options.FirstOrDefault(y => y.Id == customFieldItem?.ValueId)?.Value.Text ?? string.Empty;
×
158
                        switch (entry.Condition)
×
159
                        {
×
160
                            case CardsCondition.Equal:
×
161
                                return listValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
162
                            case CardsCondition.NotEqual:
×
163
                                return listValue != entry.ValueAsString;
×
164
                            case CardsCondition.GreaterThan:
×
NEW
165
                                return listValue.Length > entry.ValueAsNumber;
×
166
                            case CardsCondition.LessThan:
×
NEW
167
                                return listValue.Length < entry.ValueAsNumber;
×
168
                            case CardsCondition.GreaterThanOrEqual:
×
NEW
169
                                return listValue.Length >= entry.ValueAsNumber;
×
170
                            case CardsCondition.LessThanOrEqual:
×
NEW
171
                                return listValue.Length <= entry.ValueAsNumber;
×
172
                            case CardsCondition.Contains:
×
173
                                return listValue.Contains(entry.ValueAsString);
×
174
                            case CardsCondition.DoNotContains:
×
175
                                return !listValue.Contains(entry.ValueAsString);
×
176
                            case CardsCondition.AnyOfThese:
×
177
                                return entry.ValueAsStrings?.Any(y => y.Equals(listValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
178
                            case CardsCondition.NoneOfThese:
×
179
                                return entry.ValueAsStrings?.All(y => y != listValue) ?? false;
×
180
                            case CardsCondition.RegEx:
×
181
                                return Regex.IsMatch(listValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
182
                            case CardsCondition.StartsWith:
×
183
                                return listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
184
                            case CardsCondition.EndsWith:
×
185
                                return listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
186
                            case CardsCondition.DoNotStartWith:
×
187
                                return !listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
188
                            case CardsCondition.DoNotEndWith:
×
189
                                return !listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
190
                            case CardsCondition.AllOfThese:
×
191
                            default:
×
192
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type List");
×
193
                        }
×
194
                    case CustomFieldType.Number:
×
195
                        var number = customFieldItem?.Value.Number ?? decimal.MinValue;
×
196
                        switch (entry.Condition)
×
197
                        {
×
198
                            case CardsCondition.Equal:
×
NEW
199
                                return number == entry.ValueAsNumber;
×
200
                            case CardsCondition.NotEqual:
×
NEW
201
                                return number != entry.ValueAsNumber;
×
202
                            case CardsCondition.GreaterThan:
×
NEW
203
                                return number > entry.ValueAsNumber;
×
204
                            case CardsCondition.LessThan:
×
NEW
205
                                return number < entry.ValueAsNumber;
×
206
                            case CardsCondition.GreaterThanOrEqual:
×
NEW
207
                                return number >= entry.ValueAsNumber;
×
208
                            case CardsCondition.LessThanOrEqual:
×
NEW
209
                                return number <= entry.ValueAsNumber;
×
210
                            case CardsCondition.AnyOfThese:
×
NEW
211
                                return entry.ValueAsNumbers.Any(y => y == number);
×
212
                            case CardsCondition.NoneOfThese:
×
NEW
213
                                return entry.ValueAsNumbers.All(y => y != number);
×
NEW
214
                            case CardsCondition.Between:
×
NEW
215
                            {
×
NEW
216
                                if (entry.ValueAsNumbers?.Count != 2)
×
NEW
217
                                {
×
NEW
218
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Numbers");
×
NEW
219
                                }
×
NEW
220

×
NEW
221
                                decimal from = entry.ValueAsNumbers.First();
×
NEW
222
                                decimal to = entry.ValueAsNumbers.Last();
×
NEW
223
                                return number >= from && number <= to;
×
NEW
224
                            }
×
NEW
225
                            case CardsCondition.NotBetween:
×
NEW
226
                            {
×
NEW
227
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
NEW
228
                                {
×
NEW
229
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Numbers");
×
NEW
230
                                }
×
NEW
231

×
NEW
232
                                decimal from = entry.ValueAsNumbers.First();
×
NEW
233
                                decimal to = entry.ValueAsNumbers.Last();
×
NEW
234
                                return number > to || number < from;
×
NEW
235
                            }
×
236
                            default:
×
237
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Number");
×
238
                        }
×
239
                    case CustomFieldType.Text:
×
240
                    default:
×
241
                        string textValue = customFieldItem?.Value.Text ?? string.Empty;
×
242
                        switch (entry.Condition)
×
243
                        {
×
244
                            case CardsCondition.Equal:
×
245
                                return textValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
246
                            case CardsCondition.NotEqual:
×
247
                                return textValue != entry.ValueAsString;
×
248
                            case CardsCondition.GreaterThan:
×
NEW
249
                                return textValue.Length > entry.ValueAsNumber;
×
250
                            case CardsCondition.LessThan:
×
NEW
251
                                return textValue.Length < entry.ValueAsNumber;
×
252
                            case CardsCondition.GreaterThanOrEqual:
×
NEW
253
                                return textValue.Length >= entry.ValueAsNumber;
×
254
                            case CardsCondition.LessThanOrEqual:
×
NEW
255
                                return textValue.Length <= entry.ValueAsNumber;
×
256
                            case CardsCondition.Contains:
×
257
                                return textValue.Contains(entry.ValueAsString);
×
258
                            case CardsCondition.DoNotContains:
×
259
                                return !textValue.Contains(entry.ValueAsString);
×
260
                            case CardsCondition.AnyOfThese:
×
261
                                return entry.ValueAsStrings?.Any(y => y.Equals(textValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
262
                            case CardsCondition.NoneOfThese:
×
263
                                return entry.ValueAsStrings?.All(y => y != textValue) ?? false;
×
264
                            case CardsCondition.RegEx:
×
265
                                return Regex.IsMatch(textValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
266
                            case CardsCondition.StartsWith:
×
267
                                return textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
268
                            case CardsCondition.EndsWith:
×
269
                                return textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
270
                            case CardsCondition.DoNotStartWith:
×
271
                                return !textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
272
                            case CardsCondition.DoNotEndWith:
×
273
                                return !textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
274
                            case CardsCondition.AllOfThese:
×
275
                            default:
×
276
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Text");
×
277
                        }
×
278
                }
×
279
            });
×
280

281
            return cards;
×
282
        }
283

284
        private static IEnumerable<Card> FilterDueDate(IEnumerable<Card> cards, CardsFilterCondition entry)
285
        {
UNCOV
286
            switch (entry.Condition)
×
287
            {
288
                case CardsCondition.Equal:
NEW
289
                    return cards.Where(x => x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
290
                case CardsCondition.NotEqual:
NEW
291
                    return cards.Where(x => x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
292
                case CardsCondition.GreaterThan:
NEW
293
                    return cards.Where(x => x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
294
                case CardsCondition.LessThan:
NEW
295
                    return cards.Where(x => x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
296
                case CardsCondition.GreaterThanOrEqual:
NEW
297
                    return cards.Where(x => x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
298
                case CardsCondition.LessThanOrEqual:
NEW
299
                    return cards.Where(x => x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
300

301
                case CardsCondition.Between:
302
                {
NEW
303
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
304
                    {
NEW
305
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
306
                    }
307

NEW
308
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
309
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
310
                    cards = cards.Where(x => x.Due.HasValue && x.Due >= from);
×
NEW
311
                    cards = cards.Where(x => x.Due.HasValue && x.Due <= to);
×
NEW
312
                    return cards;
×
313
                }
314
                case CardsCondition.NotBetween:
315
                {
NEW
316
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
317
                    {
NEW
318
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
319
                    }
320

NEW
321
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
322
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
323
                    cards = cards.Where(x => x.Due.HasValue && x.Due > to || x.Due < from);
×
NEW
324
                    return cards;
×
325
                }
326

327
                case CardsCondition.HasAnyValue:
NEW
328
                    return cards.Where(x => x.Due.HasValue);
×
329
                case CardsCondition.DoNotHaveAnyValue:
NEW
330
                    return cards.Where(x => !x.Due.HasValue);
×
331
                case CardsCondition.AnyOfThese:
NEW
332
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
333
                case CardsCondition.NoneOfThese:
NEW
334
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
335
                default:
336
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
337
            }
338
        }
339

340
        private static IEnumerable<Card> FilterDueDateNoDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
341
        {
UNCOV
342
            switch (entry.Condition)
×
343
            {
344
                case CardsCondition.Equal:
NEW
345
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
346
                case CardsCondition.NotEqual:
NEW
347
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
348
                case CardsCondition.GreaterThan:
NEW
349
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
350
                case CardsCondition.LessThan:
NEW
351
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
352
                case CardsCondition.GreaterThanOrEqual:
NEW
353
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
354
                case CardsCondition.LessThanOrEqual:
NEW
355
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
356

357
                case CardsCondition.Between:
358
                {
NEW
359
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
360
                    {
NEW
361
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
362
                    }
363

NEW
364
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
365
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
366
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= from);
×
NEW
367
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= to);
×
NEW
368
                    return cards;
×
369
                }
370
                case CardsCondition.NotBetween:
371
                {
NEW
372
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
373
                    {
NEW
374
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
375
                    }
376

NEW
377
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
378
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
379
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > to || x.Due < from);
×
NEW
380
                    return cards;
×
381
                }
382

383
                case CardsCondition.HasAnyValue:
NEW
384
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue);
×
385
                case CardsCondition.DoNotHaveAnyValue:
NEW
386
                    return cards.Where(x => !x.Due.HasValue);
×
387
                case CardsCondition.AnyOfThese:
NEW
388
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
389
                case CardsCondition.NoneOfThese:
NEW
390
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
391
                default:
NEW
392
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
393
            }
394
        }
395

396
        private static IEnumerable<Card> FilterCreateDate(IEnumerable<Card> cards, CardsFilterCondition entry)
397
        {
NEW
398
            switch (entry.Condition)
×
399
            {
400
                case CardsCondition.Equal:
NEW
401
                    return cards.Where(x => x.Created.HasValue && x.Created == entry.ValueAsDateTimeOffset);
×
402
                case CardsCondition.NotEqual:
NEW
403
                    return cards.Where(x => x.Created.HasValue && x.Created != entry.ValueAsDateTimeOffset);
×
404
                case CardsCondition.GreaterThan:
NEW
405
                    return cards.Where(x => x.Created.HasValue && x.Created > entry.ValueAsDateTimeOffset);
×
406
                case CardsCondition.LessThan:
NEW
407
                    return cards.Where(x => x.Created.HasValue && x.Created < entry.ValueAsDateTimeOffset);
×
408
                case CardsCondition.GreaterThanOrEqual:
NEW
409
                    return cards.Where(x => x.Created.HasValue && x.Created >= entry.ValueAsDateTimeOffset);
×
410
                case CardsCondition.LessThanOrEqual:
NEW
411
                    return cards.Where(x => x.Created.HasValue && x.Created <= entry.ValueAsDateTimeOffset);
×
412
                case CardsCondition.Between:
413
                {
NEW
414
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
415
                    {
NEW
416
                        throw new TrelloApiException("Between Condition for Created Date need 2 and only 2 Dates");
×
417
                    }
418

NEW
419
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
420
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
421
                    cards = cards.Where(x => x.Created.HasValue && x.Created >= from);
×
NEW
422
                    cards = cards.Where(x => x.Created.HasValue && x.Created <= to);
×
NEW
423
                    return cards;
×
424
                }
425
                case CardsCondition.NotBetween:
426
                {
NEW
427
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
428
                    {
NEW
429
                        throw new TrelloApiException("NotBetween Condition for Created Date need 2 and only 2 Dates");
×
430
                    }
431

NEW
432
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
433
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
434
                    cards = cards.Where(x => x.Created.HasValue && x.Created > to || x.Created < from);
×
NEW
435
                    return cards;
×
436
                }
437
                case CardsCondition.AnyOfThese:
NEW
438
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.Any(y => x.Created != null && y == x.Created.Value));
×
439
                case CardsCondition.NoneOfThese:
NEW
440
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.All(y => x.Created != null && y != x.Created.Value));
×
441
                default:
NEW
442
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterCreateDate");
×
443
            }
444
        }
445

446
        private static IEnumerable<Card> FilterStartDate(IEnumerable<Card> cards, CardsFilterCondition entry)
447
        {
UNCOV
448
            switch (entry.Condition)
×
449
            {
450
                case CardsCondition.Equal:
NEW
451
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date == entry.ValueAsDateTimeOffset.Value.Date);
×
452
                case CardsCondition.NotEqual:
NEW
453
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date != entry.ValueAsDateTimeOffset.Value.Date);
×
454
                case CardsCondition.GreaterThan:
NEW
455
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date > entry.ValueAsDateTimeOffset.Value.Date);
×
456
                case CardsCondition.LessThan:
NEW
457
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date < entry.ValueAsDateTimeOffset.Value.Date);
×
458
                case CardsCondition.GreaterThanOrEqual:
NEW
459
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date >= entry.ValueAsDateTimeOffset.Value.Date);
×
460
                case CardsCondition.LessThanOrEqual:
NEW
461
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date <= entry.ValueAsDateTimeOffset.Value.Date);
×
462
                case CardsCondition.Between:
463
                {
NEW
464
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
465
                    {
NEW
466
                        throw new TrelloApiException("Between Condition for Start Date need 2 and only 2 Dates");
×
467
                    }
468

NEW
469
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
470
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
471
                    cards = cards.Where(x => x.Start.HasValue && x.Start >= from);
×
NEW
472
                    cards = cards.Where(x => x.Start.HasValue && x.Start <= to);
×
NEW
473
                    return cards;
×
474
                }
475
                case CardsCondition.NotBetween:
476
                {
NEW
477
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
478
                    {
NEW
479
                        throw new TrelloApiException("NotBetween Condition for Start Date need 2 and only 2 Dates");
×
480
                    }
481

NEW
482
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
NEW
483
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
NEW
484
                    cards = cards.Where(x => x.Start.HasValue && x.Start > to || x.Start < from);
×
NEW
485
                    return cards;
×
486
                }
487
                case CardsCondition.HasAnyValue:
NEW
488
                    return cards.Where(x => x.Start.HasValue);
×
489
                case CardsCondition.DoNotHaveAnyValue:
NEW
490
                    return cards.Where(x => !x.Start.HasValue);
×
491
                case CardsCondition.AnyOfThese:
NEW
492
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y.Date == x.Start.Value.Date));
×
493
                case CardsCondition.NoneOfThese:
NEW
494
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.All(y => y.Date != x.Start.Value.Date));
×
495
                default:
496
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterStartDate");
×
497
            }
498
        }
499

500
        private static IEnumerable<Card> FilterList(IEnumerable<Card> cards, CardsFilterCondition entry)
501
        {
502
            switch (entry.Condition)
×
503
            {
504
                case CardsCondition.AnyOfThese:
505
                case CardsCondition.Equal:
506
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
507
                    {
NEW
508
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y == x.ListId));
×
509
                    }
510

NEW
511
                    return cards.Where(x => x.ListId == entry.ValueAsString);
×
512
                case CardsCondition.NoneOfThese:
513
                case CardsCondition.NotEqual:
514
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
515
                    {
NEW
516
                        return cards.Where(x => entry.ValueAsStrings.All(y => y != x.ListId));
×
517
                    }
518

NEW
519
                    return cards.Where(x => x.ListId != entry.ValueAsString);
×
520
                default:
521
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
×
522
            }
523
        }
524

525
        private static IEnumerable<Card> FilterLabel(IEnumerable<Card> cards, CardsFilterCondition entry)
526
        {
527
            switch (entry.Condition)
×
528
            {
529
                case CardsCondition.AllOfThese:
530
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
531
                    {
NEW
532
                        return cards.Where(x => entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
×
533
                    }
534

NEW
535
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
536

537
                case CardsCondition.Equal:
538
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
539
                    {
NEW
540
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
×
541
                    }
542

NEW
543
                    return cards.Where(x => x.LabelIds.Count == 1 && x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
544

545
                case CardsCondition.AnyOfThese:
546
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
547
                    {
NEW
548
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
549
                    }
550

NEW
551
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
552

553
                case CardsCondition.NoneOfThese:
554
                case CardsCondition.NotEqual:
555
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
556
                    {
NEW
557
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
558
                    }
559

NEW
560
                    return cards.Where(x => !x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
561
                case CardsCondition.DoNotHaveAnyValue:
NEW
562
                    return cards.Where(x => x.LabelIds.Count == 0);
×
563
                case CardsCondition.HasAnyValue:
NEW
564
                    return cards.Where(x => x.LabelIds.Count != 0);
×
565
                case CardsCondition.GreaterThan:
NEW
566
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
×
567
                case CardsCondition.LessThan:
NEW
568
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
×
569
                case CardsCondition.GreaterThanOrEqual:
NEW
570
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
×
571
                case CardsCondition.LessThanOrEqual:
NEW
572
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
×
573
                case CardsCondition.Between:
574
                {
NEW
575
                    if (entry.ValueAsNumbers?.Count != 2)
×
576
                    {
NEW
577
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
578
                    }
579

NEW
580
                    decimal from = entry.ValueAsNumbers.First();
×
NEW
581
                    decimal to = entry.ValueAsNumbers.Last();
×
NEW
582
                    cards = cards.Where(x => x.LabelIds.Count >= from);
×
NEW
583
                    cards = cards.Where(x => x.LabelIds.Count <= to);
×
NEW
584
                    return cards;
×
585
                }
586
                case CardsCondition.NotBetween:
587
                {
NEW
588
                    if (entry.ValueAsNumbers?.Count != 2)
×
589
                    {
NEW
590
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
591
                    }
592

NEW
593
                    decimal from = entry.ValueAsNumbers.First();
×
NEW
594
                    decimal to = entry.ValueAsNumbers.Last();
×
NEW
595
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
×
NEW
596
                    return cards;
×
597
                }
598
                default:
599
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
600
            }
601
        }
602

603
        private static IEnumerable<Card> FilterMember(IEnumerable<Card> cards, CardsFilterCondition entry)
604
        {
605
            switch (entry.Condition)
×
606
            {
607
                case CardsCondition.AllOfThese:
608
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
609
                    {
NEW
610
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
611
                    }
612

NEW
613
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
614

615
                case CardsCondition.Equal:
616
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
617
                    {
NEW
618
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
619
                    }
620

NEW
621
                    return cards.Where(x => x.MemberIds.Count == 1 && x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
622

623
                case CardsCondition.AnyOfThese:
624

625
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
626
                    {
NEW
627
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
628
                    }
629

NEW
630
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
631

632
                case CardsCondition.NoneOfThese:
633
                case CardsCondition.NotEqual:
634
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
635
                    {
NEW
636
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
×
637
                    }
638

NEW
639
                    return cards.Where(x => !x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
×
640

641
                case CardsCondition.DoNotHaveAnyValue:
NEW
642
                    return cards.Where(x => x.MemberIds.Count == 0);
×
643
                case CardsCondition.HasAnyValue:
NEW
644
                    return cards.Where(x => x.MemberIds.Count != 0);
×
645
                case CardsCondition.GreaterThan:
NEW
646
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
×
647
                case CardsCondition.LessThan:
NEW
648
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
×
649
                case CardsCondition.GreaterThanOrEqual:
NEW
650
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
×
651
                case CardsCondition.LessThanOrEqual:
NEW
652
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
×
653
                case CardsCondition.Between:
654
                {
NEW
655
                    if (entry.ValueAsNumbers?.Count != 2)
×
656
                    {
NEW
657
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
658
                    }
659

NEW
660
                    decimal from = entry.ValueAsNumbers.First();
×
NEW
661
                    decimal to = entry.ValueAsNumbers.Last();
×
NEW
662
                    cards = cards.Where(x => x.MemberIds.Count >= from);
×
NEW
663
                    cards = cards.Where(x => x.MemberIds.Count <= to);
×
NEW
664
                    return cards;
×
665
                }
666
                case CardsCondition.NotBetween:
667
                {
NEW
668
                    if (entry.ValueAsNumbers?.Count != 2)
×
669
                    {
NEW
670
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
671
                    }
672

NEW
673
                    decimal from = entry.ValueAsNumbers.First();
×
NEW
674
                    decimal to = entry.ValueAsNumbers.Last();
×
NEW
675
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
NEW
676
                    return cards;
×
677
                }
678
                default:
679
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
680
            }
681
        }
682

683
        private static IEnumerable<Card> FilterName(IEnumerable<Card> cards, CardsFilterCondition entry)
684
        {
685
            switch (entry.Condition)
×
686
            {
687
                case CardsCondition.Equal:
688
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
689
                    {
NEW
690
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
691
                    }
692
                    else if (entry.ValueAsString != null)
×
693
                    {
NEW
694
                        return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
695
                    }
NEW
696
                    else if (entry.ValueAsNumber.HasValue)
×
697
                    {
NEW
698
                        return cards.Where(x => x.Name.Length == entry.ValueAsNumber);
×
699
                    }
700

701
                    break;
702
                case CardsCondition.NotEqual:
703
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
704
                    {
NEW
705
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
706
                    }
707
                    else if (entry.ValueAsString != null)
×
708
                    {
NEW
709
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Name));
×
710
                    }
NEW
711
                    else if (entry.ValueAsNumber.HasValue)
×
712
                    {
NEW
713
                        return cards.Where(x => x.Name.Length != entry.ValueAsNumber);
×
714
                    }
715

716
                    break;
717
                case CardsCondition.GreaterThan:
718
                    //Assume this means length of name
NEW
719
                    if (entry.ValueAsNumber.HasValue)
×
720
                    {
NEW
721
                        return cards.Where(x => x.Name.Length > entry.ValueAsNumber);
×
722
                    }
723

724
                    break;
725
                case CardsCondition.LessThan:
726
                    //Assume this means length of name
NEW
727
                    if (entry.ValueAsNumber.HasValue)
×
728
                    {
NEW
729
                        cards = cards.Where(x => x.Name.Length < entry.ValueAsNumber);
×
730
                    }
731

732
                    break;
×
733
                case CardsCondition.GreaterThanOrEqual:
734
                    //Assume this means length of name
NEW
735
                    if (entry.ValueAsNumber.HasValue)
×
736
                    {
NEW
737
                        cards = cards.Where(x => x.Name.Length >= entry.ValueAsNumber);
×
738
                    }
739

740
                    break;
×
741
                case CardsCondition.LessThanOrEqual:
742
                    //Assume this means length of name
NEW
743
                    if (entry.ValueAsNumber.HasValue)
×
744
                    {
NEW
745
                        cards = cards.Where(x => x.Name.Length <= entry.ValueAsNumber);
×
746
                    }
747

748
                    break;
×
749
                case CardsCondition.HasAnyValue:
NEW
750
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Name));
×
751
                case CardsCondition.DoNotHaveAnyValue:
NEW
752
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Name));
×
753
                case CardsCondition.Contains:
754
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
755
                    {
NEW
756
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.Contains(y)));
×
757
                    }
758

NEW
759
                    return cards.Where(x => x.Name.Contains(entry.ValueAsString));
×
760

761
                case CardsCondition.DoNotContains:
762
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
763
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
764
                    {
NEW
765
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Name.Contains(y)));
×
766
                    }
767

NEW
768
                    return cards.Where(x => !x.Name.Contains(entry.ValueAsString));
×
769

770
                case CardsCondition.AnyOfThese:
771
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
772
                    {
NEW
773
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Name)));
×
774
                    }
775

NEW
776
                    return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
777

778
                case CardsCondition.NoneOfThese:
779
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
780
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
781
                    {
NEW
782
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
×
783
                    }
784

NEW
785
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
×
786

787
                case CardsCondition.RegEx:
788
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
789
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
790
                    {
NEW
791
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Name, y, RegexOptions.IgnoreCase)));
×
792
                    }
793

NEW
794
                    return cards.Where(x => Regex.IsMatch(x.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
×
795

796
                case CardsCondition.StartsWith:
797
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
798
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
799
                    {
NEW
800
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
801
                    }
802

NEW
803
                    return cards.Where(x => x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
804

805
                case CardsCondition.EndsWith:
806
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
807
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
808
                    {
NEW
809
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
810
                    }
811

NEW
812
                    return cards.Where(x => x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
813

814
                case CardsCondition.DoNotStartWith:
815
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
816
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
817
                    {
NEW
818
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
819
                    }
820

NEW
821
                    return cards.Where(x => !x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
822

823
                case CardsCondition.DoNotEndWith:
824
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
825
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
826
                    {
NEW
827
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
828
                    }
829

NEW
830
                    return cards.Where(x => !x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
831

832
                default:
833
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Name Condition");
×
834
            }
835

836
            return cards;
×
837
        }
838

839
        private static IEnumerable<Card> FilterDescription(IEnumerable<Card> cards, CardsFilterCondition entry)
840
        {
841
            switch (entry.Condition)
×
842
            {
843
                case CardsCondition.Equal:
844
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
845
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
846
                    {
NEW
847
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
848
                    }
849
                    else if (entry.ValueAsString != null)
×
850
                    {
NEW
851
                        return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
852
                    }
NEW
853
                    else if (entry.ValueAsNumber.HasValue)
×
854
                    {
NEW
855
                        return cards.Where(x => x.Description.Length == entry.ValueAsNumber);
×
856
                    }
857

858
                    break;
859
                case CardsCondition.NotEqual:
860
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
861
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
862
                    {
NEW
863
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
864
                    }
865
                    else if (entry.ValueAsString != null)
×
866
                    {
NEW
867
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
868
                    }
NEW
869
                    else if (entry.ValueAsNumber.HasValue)
×
870
                    {
NEW
871
                        return cards.Where(x => x.Description.Length != entry.ValueAsNumber);
×
872
                    }
873

874
                    break;
875
                case CardsCondition.GreaterThan:
876
                    //Assume this means length of Description
NEW
877
                    if (entry.ValueAsNumber.HasValue)
×
878
                    {
NEW
879
                        return cards.Where(x => x.Description.Length > entry.ValueAsNumber);
×
880
                    }
881

882
                    break;
883
                case CardsCondition.LessThan:
884
                    //Assume this means length of Description
NEW
885
                    if (entry.ValueAsNumber.HasValue)
×
886
                    {
NEW
887
                        return cards.Where(x => x.Description.Length < entry.ValueAsNumber);
×
888
                    }
889

890
                    break;
891
                case CardsCondition.GreaterThanOrEqual:
892
                    //Assume this means length of Description
NEW
893
                    if (entry.ValueAsNumber.HasValue)
×
894
                    {
NEW
895
                        return cards.Where(x => x.Description.Length >= entry.ValueAsNumber);
×
896
                    }
897

898
                    break;
899
                case CardsCondition.LessThanOrEqual:
900
                    //Assume this means length of Description
NEW
901
                    if (entry.ValueAsNumber.HasValue)
×
902
                    {
NEW
903
                        return cards.Where(x => x.Description.Length <= entry.ValueAsNumber);
×
904
                    }
905

906
                    break;
907
                case CardsCondition.HasAnyValue:
NEW
908
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Description));
×
909
                case CardsCondition.DoNotHaveAnyValue:
NEW
910
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Description));
×
911
                case CardsCondition.Contains:
912
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
913
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
914
                    {
NEW
915
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.Contains(y)));
×
916
                    }
917

NEW
918
                    return cards.Where(x => x.Description.Contains(entry.ValueAsString));
×
919

920
                case CardsCondition.DoNotContains:
921
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
922
                    {
NEW
923
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.Contains(y)));
×
924
                    }
925

NEW
926
                    return cards.Where(x => !x.Description.Contains(entry.ValueAsString));
×
927

928
                case CardsCondition.AnyOfThese:
929
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
930
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
931
                    {
NEW
932
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Description)));
×
933
                    }
934

NEW
935
                    return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
936

937
                case CardsCondition.AllOfThese:
938
                {
939
                    throw new TrelloApiException("AllOfThese on Description Filter does not make sense");
×
940
                }
941
                case CardsCondition.NoneOfThese:
942
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
943
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
944
                    {
NEW
945
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
×
946
                    }
947

NEW
948
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
×
949

950
                case CardsCondition.RegEx:
951
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
952
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
953
                    {
NEW
954
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Description, y, RegexOptions.IgnoreCase)));
×
955
                    }
956

NEW
957
                    return cards.Where(x => Regex.IsMatch(x.Description, entry.ValueAsString, RegexOptions.IgnoreCase));
×
958

959
                case CardsCondition.StartsWith:
960
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
961
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
962
                    {
NEW
963
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
964
                    }
965

NEW
966
                    return cards.Where(x => x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
967

968
                case CardsCondition.EndsWith:
969
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
970
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
971
                    {
NEW
972
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
973
                    }
974

NEW
975
                    return cards.Where(x => x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
976

977
                case CardsCondition.DoNotStartWith:
978
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
979
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
980
                    {
NEW
981
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
982
                    }
983

NEW
984
                    return cards.Where(x => !x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
985

986
                case CardsCondition.DoNotEndWith:
987
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
988
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
×
989
                    {
NEW
990
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
991
                    }
992

NEW
993
                    return cards.Where(x => !x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
×
994

995
                default:
996
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Description Condition");
×
997
            }
998

999
            return cards;
×
1000
        }
1001
    }
1002
}
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