@@ -33,31 +33,40 @@ function getInterpreter<T extends Record<string, AnyInterpreter>>(
33
33
34
34
export interface InterpreterOptions {
35
35
numberOfArguments ?: 1 | 2 | 3
36
+ getInterpreterName ?( condition : Condition , context : this) : string
37
+ }
38
+
39
+ function defaultInterpreterName ( condition : Condition ) {
40
+ return condition . operator ;
36
41
}
37
42
38
43
export function createInterpreter < T extends AnyInterpreter , U extends { } = { } > (
39
44
interpreters : Record < string , T > ,
40
45
rawOptions ?: U
41
46
) {
42
47
const options = rawOptions as U & InterpreterOptions ;
48
+ const getInterpreterName = options && options . getInterpreterName || defaultInterpreterName ;
43
49
let interpret ;
44
50
45
51
switch ( options ? options . numberOfArguments : 0 ) {
46
52
case 1 :
47
53
interpret = ( ( condition ) => {
48
- const interpretOperator = getInterpreter ( interpreters , condition . operator ) ;
54
+ const interpreterName = getInterpreterName ( condition , options ) ;
55
+ const interpretOperator = getInterpreter ( interpreters , interpreterName ) ;
49
56
return interpretOperator ( condition , defaultContext ) ; // eslint-disable-line @typescript-eslint/no-use-before-define
50
57
} ) as InterpretationContext < T > [ 'interpret' ] ;
51
58
break ;
52
59
case 3 :
53
60
interpret = ( ( condition , value , params ) => {
54
- const interpretOperator = getInterpreter ( interpreters , condition . operator ) ;
61
+ const interpreterName = getInterpreterName ( condition , options ) ;
62
+ const interpretOperator = getInterpreter ( interpreters , interpreterName ) ;
55
63
return interpretOperator ( condition , value , params , defaultContext ) ; // eslint-disable-line @typescript-eslint/no-use-before-define
56
64
} ) as InterpretationContext < T > [ 'interpret' ] ;
57
65
break ;
58
66
default :
59
67
interpret = ( ( condition , value ) => {
60
- const interpretOperator = getInterpreter ( interpreters , condition . operator ) ;
68
+ const interpreterName = getInterpreterName ( condition , options ) ;
69
+ const interpretOperator = getInterpreter ( interpreters , interpreterName ) ;
61
70
return interpretOperator ( condition , value , defaultContext ) ; // eslint-disable-line @typescript-eslint/no-use-before-define
62
71
} ) as InterpretationContext < T > [ 'interpret' ] ;
63
72
break ;
0 commit comments