Skip to content

Commit d51d730

Browse files
authored
Merge pull request #14 from Instancify/feat/regex-functions
feat: added regex functions
2 parents d67e69c + 7648cb4 commit d51d730

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

api/src/main/java/com/instancify/scriptify/api/exception/ScriptFunctionArgTypeException.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.instancify.scriptify.api.exception;
22

3+
import java.util.Collection;
4+
import java.util.stream.Collectors;
5+
36
/**
47
* Exception for script function argument type mismatches.
58
*/
@@ -14,4 +17,18 @@ public class ScriptFunctionArgTypeException extends ScriptFunctionException {
1417
public ScriptFunctionArgTypeException(Class<?> required, Class<?> provided) {
1518
super("Required argument type: " + required + ", passed: " + provided);
1619
}
20+
21+
/**
22+
* Creates an exception when argument types don't match.
23+
*
24+
* @param required The expected types
25+
* @param provided The type that was given
26+
*/
27+
public ScriptFunctionArgTypeException(Collection<Class<?>> required, Class<?> provided) {
28+
super("Required argument types: " + createRequiredClassNames(required) + ", passed: " + provided);
29+
}
30+
31+
private static String createRequiredClassNames(Collection<Class<?>> required) {
32+
return required.stream().map(Class::getName).collect(Collectors.joining(" or "));
33+
}
1734
}

core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public StandardFunctionManager() {
5353
this.register(new ScriptFunctionListOf());
5454
this.register(new ScriptFunctionSetOf());
5555
this.register(new ScriptFunctionArrayOf());
56+
this.register(new ScriptFunctionRegexPattern());
57+
this.register(new ScriptFunctionRegexMatch());
5658
}
5759

5860
@Override
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.instancify.scriptify.core.script.function.impl.util;
2+
3+
import com.instancify.scriptify.api.exception.ScriptFunctionArgTypeException;
4+
import com.instancify.scriptify.api.exception.ScriptFunctionArgsCountException;
5+
import com.instancify.scriptify.api.exception.ScriptFunctionException;
6+
import com.instancify.scriptify.api.script.Script;
7+
import com.instancify.scriptify.api.script.function.ScriptFunction;
8+
import com.instancify.scriptify.api.script.function.argument.ScriptFunctionArgument;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.util.Set;
12+
import java.util.regex.Pattern;
13+
14+
/**
15+
* Represents a function to match regex pattern
16+
*/
17+
public class ScriptFunctionRegexMatch implements ScriptFunction {
18+
19+
@Override
20+
public @NotNull String getName() {
21+
return "regex_match";
22+
}
23+
24+
@Override
25+
public Object invoke(Script<?> script, ScriptFunctionArgument[] args) throws ScriptFunctionException {
26+
if (args.length != 2) {
27+
throw new ScriptFunctionArgsCountException(1, args.length);
28+
}
29+
30+
Pattern pattern;
31+
if (args[0].getValue() instanceof String regex) {
32+
pattern = Pattern.compile(regex);
33+
} else if (args[0].getValue() instanceof Pattern) {
34+
pattern = (Pattern) args[0].getValue();
35+
} else {
36+
throw new ScriptFunctionArgTypeException(Set.of(String.class, Pattern.class), args[0].getType());
37+
}
38+
39+
if (!(args[1].getValue() instanceof String value)) {
40+
throw new ScriptFunctionArgTypeException(String.class, args[1].getType());
41+
}
42+
43+
return pattern.matcher(value).matches();
44+
}
45+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.instancify.scriptify.core.script.function.impl.util;
2+
3+
import com.instancify.scriptify.api.exception.ScriptFunctionArgTypeException;
4+
import com.instancify.scriptify.api.exception.ScriptFunctionArgsCountException;
5+
import com.instancify.scriptify.api.exception.ScriptFunctionException;
6+
import com.instancify.scriptify.api.script.Script;
7+
import com.instancify.scriptify.api.script.function.ScriptFunction;
8+
import com.instancify.scriptify.api.script.function.argument.ScriptFunctionArgument;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.util.regex.Pattern;
12+
13+
/**
14+
* Represents a function to compile regex pattern.
15+
*/
16+
public class ScriptFunctionRegexPattern implements ScriptFunction {
17+
18+
@Override
19+
public @NotNull String getName() {
20+
return "regex_pattern";
21+
}
22+
23+
@Override
24+
public Object invoke(Script<?> script, ScriptFunctionArgument[] args) throws ScriptFunctionException {
25+
if (args.length != 1) {
26+
throw new ScriptFunctionArgsCountException(1, args.length);
27+
}
28+
29+
if (!(args[0].getValue() instanceof String pattern)) {
30+
throw new ScriptFunctionArgTypeException(String.class, args[0].getType());
31+
}
32+
33+
return Pattern.compile(pattern);
34+
}
35+
}

0 commit comments

Comments
 (0)