diff --git a/api/src/main/java/com/instancify/scriptify/api/exception/ScriptFunctionArgTypeException.java b/api/src/main/java/com/instancify/scriptify/api/exception/ScriptFunctionArgTypeException.java index 9a20eb5..2b073e4 100644 --- a/api/src/main/java/com/instancify/scriptify/api/exception/ScriptFunctionArgTypeException.java +++ b/api/src/main/java/com/instancify/scriptify/api/exception/ScriptFunctionArgTypeException.java @@ -1,5 +1,8 @@ package com.instancify.scriptify.api.exception; +import java.util.Collection; +import java.util.stream.Collectors; + /** * Exception for script function argument type mismatches. */ @@ -14,4 +17,18 @@ public class ScriptFunctionArgTypeException extends ScriptFunctionException { public ScriptFunctionArgTypeException(Class required, Class provided) { super("Required argument type: " + required + ", passed: " + provided); } + + /** + * Creates an exception when argument types don't match. + * + * @param required The expected types + * @param provided The type that was given + */ + public ScriptFunctionArgTypeException(Collection> required, Class provided) { + super("Required argument types: " + createRequiredClassNames(required) + ", passed: " + provided); + } + + private static String createRequiredClassNames(Collection> required) { + return required.stream().map(Class::getName).collect(Collectors.joining(" or ")); + } } diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java b/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java index ac7bd6b..162c577 100644 --- a/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java @@ -53,6 +53,8 @@ public StandardFunctionManager() { this.register(new ScriptFunctionListOf()); this.register(new ScriptFunctionSetOf()); this.register(new ScriptFunctionArrayOf()); + this.register(new ScriptFunctionRegexPattern()); + this.register(new ScriptFunctionRegexMatch()); } @Override diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexMatch.java b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexMatch.java new file mode 100644 index 0000000..9526663 --- /dev/null +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexMatch.java @@ -0,0 +1,45 @@ +package com.instancify.scriptify.core.script.function.impl.util; + +import com.instancify.scriptify.api.exception.ScriptFunctionArgTypeException; +import com.instancify.scriptify.api.exception.ScriptFunctionArgsCountException; +import com.instancify.scriptify.api.exception.ScriptFunctionException; +import com.instancify.scriptify.api.script.Script; +import com.instancify.scriptify.api.script.function.ScriptFunction; +import com.instancify.scriptify.api.script.function.argument.ScriptFunctionArgument; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; +import java.util.regex.Pattern; + +/** + * Represents a function to match regex pattern + */ +public class ScriptFunctionRegexMatch implements ScriptFunction { + + @Override + public @NotNull String getName() { + return "regex_match"; + } + + @Override + public Object invoke(Script script, ScriptFunctionArgument[] args) throws ScriptFunctionException { + if (args.length != 2) { + throw new ScriptFunctionArgsCountException(1, args.length); + } + + Pattern pattern; + if (args[0].getValue() instanceof String regex) { + pattern = Pattern.compile(regex); + } else if (args[0].getValue() instanceof Pattern) { + pattern = (Pattern) args[0].getValue(); + } else { + throw new ScriptFunctionArgTypeException(Set.of(String.class, Pattern.class), args[0].getType()); + } + + if (!(args[1].getValue() instanceof String value)) { + throw new ScriptFunctionArgTypeException(String.class, args[1].getType()); + } + + return pattern.matcher(value).matches(); + } +} diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexPattern.java b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexPattern.java new file mode 100644 index 0000000..76f7293 --- /dev/null +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/util/ScriptFunctionRegexPattern.java @@ -0,0 +1,35 @@ +package com.instancify.scriptify.core.script.function.impl.util; + +import com.instancify.scriptify.api.exception.ScriptFunctionArgTypeException; +import com.instancify.scriptify.api.exception.ScriptFunctionArgsCountException; +import com.instancify.scriptify.api.exception.ScriptFunctionException; +import com.instancify.scriptify.api.script.Script; +import com.instancify.scriptify.api.script.function.ScriptFunction; +import com.instancify.scriptify.api.script.function.argument.ScriptFunctionArgument; +import org.jetbrains.annotations.NotNull; + +import java.util.regex.Pattern; + +/** + * Represents a function to compile regex pattern. + */ +public class ScriptFunctionRegexPattern implements ScriptFunction { + + @Override + public @NotNull String getName() { + return "regex_pattern"; + } + + @Override + public Object invoke(Script script, ScriptFunctionArgument[] args) throws ScriptFunctionException { + if (args.length != 1) { + throw new ScriptFunctionArgsCountException(1, args.length); + } + + if (!(args[0].getValue() instanceof String pattern)) { + throw new ScriptFunctionArgTypeException(String.class, args[0].getType()); + } + + return Pattern.compile(pattern); + } +}