Skip to content

Commit fe394c8

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 b1733cb commit fe394c8

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

src/benchttp/field/core/validator.ts

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

0 commit comments

Comments
 (0)