Skip to content

Commit 748eb75

Browse files
authored
refactor: Extract FilterInstructionsBasedField class to reduce more repetition (#818)
* refactor: Extract class FilterInstructionsBasedField The fields that are implemented using FilterInstructions have a lot of duplicated code. This commit starts to eliminate that duplication by introducing a partial implementation of Field called FilterInstructionsBasedField. Not the best of names, but it is an implementation detail. * refactor: Reimplement RecurringField using FilterInstructionsBasedField * refactor: Reimplement StatusField using FilterInstructionsBasedField * chore: Tidy up unnecessary remnant comment.
1 parent 1a9294f commit 748eb75

File tree

5 files changed

+31
-56
lines changed

5 files changed

+31
-56
lines changed
Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
import { Field } from './Field';
2-
import type { FilterOrErrorMessage } from './Filter';
3-
import { FilterInstructions } from './FilterInstructions';
1+
import { FilterInstructionsBasedField } from './FilterInstructionsBasedField';
42

53
/**
64
* Implements 'exclude sub-items' filter
75
*/
8-
export class ExcludeSubItemsField extends Field {
9-
private readonly _filters = new FilterInstructions();
10-
6+
export class ExcludeSubItemsField extends FilterInstructionsBasedField {
117
constructor() {
128
super();
139

@@ -17,19 +13,7 @@ export class ExcludeSubItemsField extends Field {
1713
);
1814
}
1915

20-
public canCreateFilterForLine(line: string): boolean {
21-
return this._filters.canCreateFilterForLine(line);
22-
}
23-
24-
public createFilterOrErrorMessage(line: string): FilterOrErrorMessage {
25-
return this._filters.createFilterOrErrorMessage(line);
26-
}
27-
2816
protected fieldName(): string {
2917
return 'exclude';
3018
}
31-
32-
protected filterRegexp(): RegExp | null {
33-
return null;
34-
}
3519
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Field } from './Field';
2+
import { FilterInstructions } from './FilterInstructions';
3+
import type { FilterOrErrorMessage } from './Filter';
4+
5+
/**
6+
* This class is an implementation for implements of {@link Field}
7+
*
8+
* The named of the class is weak. It is based solely on the fact that the
9+
* class is entirely implemented via the {@link FilterInstructions} class.
10+
*/
11+
export abstract class FilterInstructionsBasedField extends Field {
12+
protected readonly _filters = new FilterInstructions();
13+
14+
public canCreateFilterForLine(line: string): boolean {
15+
return this._filters.canCreateFilterForLine(line);
16+
}
17+
18+
public createFilterOrErrorMessage(line: string): FilterOrErrorMessage {
19+
return this._filters.createFilterOrErrorMessage(line);
20+
}
21+
22+
protected filterRegexp(): RegExp | null {
23+
return null;
24+
}
25+
}

src/Query/Filter/RecurringField.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import { Field } from './Field';
2-
import type { FilterOrErrorMessage } from './Filter';
3-
import { FilterInstructions } from './FilterInstructions';
4-
5-
export class RecurringField extends Field {
6-
private readonly _filters = new FilterInstructions();
1+
import { FilterInstructionsBasedField } from './FilterInstructionsBasedField';
72

3+
export class RecurringField extends FilterInstructionsBasedField {
84
constructor() {
95
super();
106
this._filters.add('is recurring', (task) => task.recurrence !== null);
@@ -14,19 +10,7 @@ export class RecurringField extends Field {
1410
);
1511
}
1612

17-
public canCreateFilterForLine(line: string): boolean {
18-
return this._filters.canCreateFilterForLine(line);
19-
}
20-
21-
public createFilterOrErrorMessage(line: string): FilterOrErrorMessage {
22-
return this._filters.createFilterOrErrorMessage(line);
23-
}
24-
2513
protected fieldName(): string {
2614
return 'recurring';
2715
}
28-
29-
protected filterRegexp(): RegExp | null {
30-
return null;
31-
}
3216
}

src/Query/Filter/StatusField.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import { Status, Task } from '../../Task';
2-
import { Field } from './Field';
3-
import type { FilterOrErrorMessage } from './Filter';
4-
import { FilterInstructions } from './FilterInstructions';
5-
6-
export class StatusField extends Field {
7-
private readonly _filters = new FilterInstructions();
2+
import { FilterInstructionsBasedField } from './FilterInstructionsBasedField';
83

4+
export class StatusField extends FilterInstructionsBasedField {
95
constructor() {
106
super();
117

@@ -16,19 +12,7 @@ export class StatusField extends Field {
1612
);
1713
}
1814

19-
public canCreateFilterForLine(line: string): boolean {
20-
return this._filters.canCreateFilterForLine(line);
21-
}
22-
23-
public createFilterOrErrorMessage(line: string): FilterOrErrorMessage {
24-
return this._filters.createFilterOrErrorMessage(line);
25-
}
26-
2715
protected fieldName(): string {
2816
return 'status';
2917
}
30-
31-
protected filterRegexp(): RegExp | null {
32-
return null;
33-
}
3418
}

tests/Query/Filter/ExcludeSubItemsField.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// 'exclude sub-items'
2-
31
import { testTaskFilter } from '../../TestingTools/FilterTestHelpers';
42
import { fromLine } from '../../TestHelpers';
53
import { ExcludeSubItemsField } from '../../../src/Query/Filter/ExcludeSubItemsField';

0 commit comments

Comments
 (0)