Skip to content

Commit b477586

Browse files
committed
wip: experiment: field validation V2
Goal: validate a field based both on the on the validity of its keys but also on parent-child relationships
1 parent e47f7c5 commit b477586

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

src/benchttp/field/core/validator.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { Nullable } from '@/typing/nullable'
2+
3+
import {
4+
isHTTPCodeKey,
5+
isIndexKey,
6+
isQuantileKey,
7+
isRootKey,
8+
isStatisticsKey,
9+
} from './key'
10+
11+
type FieldValidator =
12+
| RootFieldValidator
13+
| StatisticsFieldValidator
14+
| QuantileFieldValidator
15+
| HTTPCodeFieldValidator
16+
| IndexFieldValidator
17+
18+
type FieldClass =
19+
| typeof RootFieldValidator
20+
| typeof StatisticsFieldValidator
21+
| typeof QuantileFieldValidator
22+
| typeof HTTPCodeFieldValidator
23+
| typeof IndexFieldValidator
24+
25+
interface IFieldValidator {
26+
keyValidator: (key: string) => boolean
27+
childValidators: FieldClass[]
28+
}
29+
30+
abstract class AbstractFieldValidator implements IFieldValidator {
31+
key: string
32+
child: Nullable<FieldValidator>
33+
34+
constructor({ child, key }: Pick<AbstractFieldValidator, 'key' | 'child'>) {
35+
this.child = child
36+
this.key = key
37+
}
38+
39+
abstract keyValidator: IFieldValidator['keyValidator']
40+
41+
abstract childValidators: IFieldValidator['childValidators']
42+
43+
public readonly isValid = (): boolean =>
44+
this.keyValidator(this.key) && this.hasValidChild()
45+
46+
private hasValidChild = (): boolean =>
47+
!this.child ||
48+
this.childValidators.some((Allowed) => this.child instanceof Allowed)
49+
}
50+
51+
export class QuantileFieldValidator extends AbstractFieldValidator {
52+
keyValidator = isQuantileKey
53+
childValidators = [IndexFieldValidator]
54+
}
55+
56+
export class StatisticsFieldValidator extends AbstractFieldValidator {
57+
keyValidator = isStatisticsKey
58+
childValidators = [QuantileFieldValidator]
59+
}
60+
61+
export class RootFieldValidator extends AbstractFieldValidator {
62+
keyValidator = isRootKey
63+
childValidators = [StatisticsFieldValidator]
64+
}
65+
66+
export class IndexFieldValidator extends AbstractFieldValidator {
67+
keyValidator = isIndexKey
68+
childValidators = []
69+
}
70+
71+
export class HTTPCodeFieldValidator extends AbstractFieldValidator {
72+
keyValidator = isHTTPCodeKey
73+
childValidators = [IndexFieldValidator]
74+
}

0 commit comments

Comments
 (0)