@@ -14,112 +14,133 @@ export function getEnumValueByKey<T extends object>(
1414}
1515
1616export interface chainConfigElement < T > {
17- elementName : string ;
18- elementType ?: T ;
19- elementTypeguard ?: ( value : unknown ) => boolean ;
20- subElementType ?: T ;
21- subElementFunctionTypeguard ?: ( value : unknown ) => boolean ;
17+ configElement : string ;
18+ configElementType ?: T ;
19+ configElementTypeguard ?: ( value : unknown , log ?: Logger ) => boolean ;
20+ configSubElementType ?: T ;
21+ configSubElementFunctionTypeguard ?: ( value : unknown , log ?: Logger ) => boolean ;
2222}
2323
2424export function identifyAndCheckConfigFormat < T > (
25- obligatoryConfigElements : chainConfigElement < T > [ ] ,
25+ configElements : chainConfigElement < T > [ ] ,
2626 obj : Record < string , any > ,
2727 log : Logger ,
2828 fnTag : string ,
2929 optionalConfigElements : chainConfigElement < T > [ ] = [ ] ,
3030) : boolean {
31- if ( obligatoryConfigElements . length === 0 ) {
32- log . error ( "No configuration elements provided for validation." ) ;
31+ if ( configElements . length === 0 ) {
32+ log . error ( "No config elements where provided for validation." ) ;
3333 return false ;
3434 }
3535
3636 /* Check if all obligatory elements for the config are present */
37- for ( const element of obligatoryConfigElements ) {
38- if ( element . elementName in obj ) {
37+ for ( const element of configElements ) {
38+ if ( ! ( element . configElement in obj ) ) {
3939 return false ;
4040 }
4141 }
4242
43- for ( const element of obligatoryConfigElements ) {
43+ /* Check if all obligatory elements are of the correct type */
44+ for ( const element of configElements ) {
45+ const check1 = checkConfigElementFormat ( element , obj , log , fnTag ) ;
46+ if ( ! check1 ) {
47+ return false ;
48+ }
49+ }
50+
51+ /* Check if all optional elements that are present are of the correct type */
52+ if ( optionalConfigElements . length !== 0 ) {
53+ for ( const element of optionalConfigElements ) {
54+ const check2 = checkConfigElementFormat (
55+ element ,
56+ obj ,
57+ log ,
58+ fnTag ,
59+ element . configElement in obj ,
60+ ) ;
61+ if ( ! check2 ) {
62+ return false ;
63+ }
64+ }
65+ }
66+
67+ return true ;
68+ }
69+
70+ export function checkConfigElementFormat < T > (
71+ ccElement : chainConfigElement < T > ,
72+ obj : Record < string , any > ,
73+ log : Logger ,
74+ fnTag : string ,
75+ elementInConfig : boolean = true ,
76+ ) : boolean {
77+ if ( elementInConfig ) {
78+ if ( ! ccElement . configElementType && ! ccElement . configElementTypeguard ) {
79+ log . error (
80+ `${ fnTag } : ${ ccElement . configElement } provided with no corresponding way for typecheck` ,
81+ ) ;
82+ return false ;
83+ }
4484 if (
45- element . elementType &&
46- typeof obj [ element . elementName ] !== typeof element . elementType
85+ ccElement . configElementType &&
86+ typeof obj [ ccElement . configElement ] !== typeof ccElement . configElementType
4787 ) {
4888 log . error (
49- `${ fnTag } : ${ element . elementName } present but not of type ${ element . elementType } ` ,
89+ `${ fnTag } : ${ ccElement . configElement } present but not of type ${ ccElement . configElementType } ` ,
5090 ) ;
5191 return false ;
5292 } else if (
53- element . elementTypeguard &&
54- ! element . elementTypeguard ( obj [ element . elementName ] )
93+ ccElement . configElementTypeguard &&
94+ ! ccElement . configElementTypeguard ( obj [ ccElement . configElement ] )
5595 ) {
5696 log . error (
57- `${ fnTag } : ${ element . elementName } present but with invalid format` ,
97+ `${ fnTag } : ${ ccElement . configElement } present but with invalid format` ,
5898 ) ;
5999 return false ;
60100 } else {
61- log . error (
62- `${ fnTag } : ${ element . elementName } provided with no way for typecheck` ,
63- ) ;
64- return false ;
65- }
66- }
67-
68- if ( optionalConfigElements . length !== 0 ) {
69- for ( const element of optionalConfigElements ) {
70- if ( element . elementName in obj ) {
71- if (
72- element . elementType &&
73- typeof obj [ element . elementName ] !== typeof element . elementType
74- ) {
75- log . error (
76- `${ fnTag } : ${ element . elementName } present but not of type ${ element . elementType } ` ,
77- ) ;
78- return false ;
79- } else if (
80- element . elementTypeguard &&
81- ! element . elementTypeguard ( obj [ element . elementName ] )
82- ) {
83- log . error (
84- `${ fnTag } : ${ element . elementName } present but with invalid format` ,
85- ) ;
86- return false ;
87- }
88-
89- if (
90- element . elementType === Array &&
91- ! element . subElementType &&
92- ! element . subElementFunctionTypeguard
93- ) {
94- log . error (
95- `${ fnTag } : ${ element . elementName } is an array but no type check is provided for its elements` ,
96- ) ;
97- return false ;
98- } else if ( element . elementType === Array && element . subElementType ) {
99- obj [ element . elementName ] . forEach ( ( subEl : unknown ) => {
100- if ( typeof subEl !== typeof element . subElementType ) {
101- log . error (
102- `${ fnTag } : ${ element . elementName } is an array but contains invalid type elements` ,
103- ) ;
104- return false ;
105- }
106- } ) ;
107- } else if (
108- element . elementType === Array &&
109- element . subElementFunctionTypeguard
110- ) {
111- obj [ element . elementName ] . forEach ( ( subEl : unknown ) => {
112- if ( ! element . subElementFunctionTypeguard ! ( subEl ) ) {
113- log . error (
114- `${ fnTag } : ${ element . elementName } is an array but contains invalid format elements` ,
115- ) ;
116- return false ;
117- }
118- } ) ;
119- }
101+ if (
102+ ccElement . configElementType === Array &&
103+ ! ccElement . configSubElementType &&
104+ ! ccElement . configSubElementFunctionTypeguard
105+ ) {
106+ log . error (
107+ `${ fnTag } : ${ ccElement . configElement } is an array but no type check is provided for its elements` ,
108+ ) ;
109+ return false ;
110+ } else if (
111+ ccElement . configElementType === Array &&
112+ ccElement . configSubElementType
113+ ) {
114+ obj [ ccElement . configElement ] . forEach ( ( subEl : unknown ) => {
115+ if (
116+ typeof subEl !== typeof ccElement . configSubElementType ||
117+ subEl === null
118+ ) {
119+ log . error (
120+ `${ fnTag } : ${ ccElement . configElement } is an array but contains invalid type elements` ,
121+ ) ;
122+ return false ;
123+ }
124+ } ) ;
125+ } else if (
126+ ccElement . configElementType === Array &&
127+ ccElement . configSubElementFunctionTypeguard
128+ ) {
129+ obj [ ccElement . configElement ] . forEach ( ( subEl : unknown ) => {
130+ if (
131+ ! ccElement . configSubElementFunctionTypeguard ! ( subEl ) ||
132+ subEl === null
133+ ) {
134+ log . error (
135+ `${ fnTag } : ${ ccElement . configElement } is an array but contains invalid format elements` ,
136+ ) ;
137+ return false ;
138+ }
139+ } ) ;
140+ } else {
141+ return true ;
120142 }
121143 }
122144 }
123-
124145 return true ;
125146}
0 commit comments