Skip to content

Commit d6d4710

Browse files
committed
Add built-in function library for script
1 parent dc35ab1 commit d6d4710

File tree

4 files changed

+552
-0
lines changed

4 files changed

+552
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.relogiclabs.jschema.internal.library;
2+
3+
import com.relogiclabs.jschema.internal.engine.ScopeContext;
4+
import com.relogiclabs.jschema.internal.script.GParameter;
5+
import com.relogiclabs.jschema.internal.script.RFunction;
6+
import com.relogiclabs.jschema.type.EValue;
7+
import lombok.Getter;
8+
9+
import java.util.Arrays;
10+
import java.util.List;
11+
12+
import static com.relogiclabs.jschema.internal.engine.ScriptTreeHelper.areCompatible;
13+
import static com.relogiclabs.jschema.internal.util.CollectionHelper.getLast;
14+
import static com.relogiclabs.jschema.message.ErrorCode.FUNS06;
15+
16+
@Getter
17+
public class NFunction implements RFunction {
18+
private final NHandler handler;
19+
private final GParameter[] parameters;
20+
21+
public NFunction(NHandler handler, String... parameters) {
22+
this.handler = handler;
23+
this.parameters = toParameters(parameters);
24+
}
25+
26+
private static GParameter[] toParameters(String... names) {
27+
return Arrays.stream(names).map(GParameter::new).toArray(GParameter[]::new);
28+
}
29+
30+
@Override
31+
public EValue invoke(ScopeContext functionScope, List<EValue> arguments) {
32+
return handler.invoke(functionScope, arguments);
33+
}
34+
35+
@Override
36+
public ScopeContext bind(ScopeContext parentScope, List<EValue> arguments) {
37+
areCompatible(parameters, arguments, FUNS06);
38+
return parentScope;
39+
}
40+
41+
@Override
42+
public boolean isVariadic() {
43+
if(parameters.length == 0) return false;
44+
return getLast(parameters).isVariadic();
45+
}
46+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.relogiclabs.jschema.internal.library;
2+
3+
import com.relogiclabs.jschema.internal.engine.ScopeContext;
4+
import com.relogiclabs.jschema.type.EValue;
5+
6+
import java.util.List;
7+
8+
@FunctionalInterface
9+
public interface NHandler {
10+
EValue invoke(ScopeContext scope, List<EValue> arguments);
11+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.relogiclabs.jschema.internal.library;
2+
3+
public interface ScriptConstant {
4+
String CALLER_HVAR = "+caller";
5+
String TARGET_HVAR = "+target";
6+
7+
String ACTUAL_FN1 = "actual#1";
8+
String ACTUAL_FN2 = "actual#2";
9+
String CEIL_FN1 = "ceil#1";
10+
String COPY_FN1 = "copy#1";
11+
String EXPECTED_FN1 = "expected#1";
12+
String EXPECTED_FN2 = "expected#2";
13+
String FAIL_FN1 = "fail#1";
14+
String FAIL_FN2 = "fail#2";
15+
String FAIL_FN4 = "fail#4";
16+
String FILL_FN2 = "fill#2";
17+
String FIND_FN2 = "find#2";
18+
String FIND_FN3 = "find#3";
19+
String FLOOR_FN1 = "floor#1";
20+
String LOG_FN1 = "log#1";
21+
String MOD_FN2 = "mod#2";
22+
String POW_FN2 = "pow#2";
23+
String PRINT_FNV = "print#...";
24+
String REGULAR_FN1 = "regular#1";
25+
String SIZE_FN1 = "size#1";
26+
String STRINGIFY_FN1 = "stringify#1";
27+
String TICKS_FN0 = "ticks#0";
28+
String TYPE_FN1 = "type#1";
29+
30+
String ACTUAL_ID = "actual";
31+
String ARGS_IDV = "args...";
32+
String CODE_ID = "code";
33+
String EXPECTED_ID = "expected";
34+
String FROM_ID = "from";
35+
String GROUP_ID = "group";
36+
String ITEM_ID = "item";
37+
String MESSAGE_ID = "message";
38+
String NODE_ID = "node";
39+
String SIZE_ID = "size";
40+
String VALUE1_ID = "value1";
41+
String VALUE2_ID = "value2";
42+
String VALUE_ID = "value";
43+
}

0 commit comments

Comments
 (0)