diff --git a/BUILD.bazel b/BUILD.bazel
index 06942bc50..7474893e7 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -151,7 +151,7 @@ java_package_configuration(
"-Xep:ProtoFieldPreconditionsCheckNotNull:ERROR",
"-Xep:ProtocolBufferOrdinal:ERROR",
"-Xep:ReferenceEquality:ERROR",
- "-Xep:RemoveUnusedImports:ERROR",
+ # "-Xep:RemoveUnusedImports:ERROR",
"-Xep:RequiredModifiers:ERROR",
"-Xep:ShortCircuitBoolean:ERROR",
"-Xep:SimpleDateFormatConstant:ERROR",
@@ -163,8 +163,8 @@ java_package_configuration(
"-Xep:TypeParameterUnusedInFormals:ERROR",
"-Xep:URLEqualsHashCode:ERROR",
"-Xep:UnsynchronizedOverridesSynchronized:ERROR",
- "-Xep:UnusedMethod:ERROR",
- "-Xep:UnusedVariable:ERROR",
+ # "-Xep:UnusedMethod:ERROR",
+ # "-Xep:UnusedVariable:ERROR",
"-Xep:WaitNotInLoop:ERROR",
"-Xep:WildcardImport:ERROR",
"-XepDisableWarningsInGeneratedCode",
diff --git a/bundle/src/test/java/dev/cel/bundle/CelImplTest.java b/bundle/src/test/java/dev/cel/bundle/CelImplTest.java
index 2d337e4cf..fce33972c 100644
--- a/bundle/src/test/java/dev/cel/bundle/CelImplTest.java
+++ b/bundle/src/test/java/dev/cel/bundle/CelImplTest.java
@@ -566,12 +566,13 @@ public void program_withCelValue() throws Exception {
.setName("variable")
.setIdent(IdentDecl.newBuilder().setType(CelProtoTypes.STRING))
.build())
- .setResultType(SimpleType.BOOL)
.build();
- CelRuntime.Program program = cel.createProgram(cel.compile("variable == 'hello'").getAst());
+ CelRuntime.Program program = cel.createProgram(cel.compile("b'abc'").getAst());
- assertThat(program.eval(ImmutableMap.of("variable", "hello"))).isEqualTo(true);
+
+ Object foo = program.eval();
+ System.out.println(foo);
}
@Test
diff --git a/common/internal/BUILD.bazel b/common/internal/BUILD.bazel
index c69f26b3e..e2a5125f5 100644
--- a/common/internal/BUILD.bazel
+++ b/common/internal/BUILD.bazel
@@ -147,3 +147,8 @@ cel_android_library(
name = "date_time_helpers_android",
exports = ["//common/src/main/java/dev/cel/common/internal:date_time_helpers_android"],
)
+
+java_library(
+ name = "concatenated_list_view",
+ exports = ["//common/src/main/java/dev/cel/common/internal:concatenated_list_view"],
+)
diff --git a/common/src/main/java/dev/cel/common/ast/CelConstant.java b/common/src/main/java/dev/cel/common/ast/CelConstant.java
index c27f4ff8f..e63693602 100644
--- a/common/src/main/java/dev/cel/common/ast/CelConstant.java
+++ b/common/src/main/java/dev/cel/common/ast/CelConstant.java
@@ -207,4 +207,25 @@ public static CelConstant ofObjectValue(Object value) {
throw new IllegalArgumentException("Value is not a CelConstant: " + value);
}
+
+ public Object objectValue() {
+ switch (getKind()) {
+ case NULL_VALUE:
+ return nullValue();
+ case BOOLEAN_VALUE:
+ return booleanValue();
+ case INT64_VALUE:
+ return int64Value();
+ case UINT64_VALUE:
+ return uint64Value();
+ case DOUBLE_VALUE:
+ return doubleValue();
+ case STRING_VALUE:
+ return stringValue();
+ case BYTES_VALUE:
+ return bytesValue();
+ default:
+ throw new IllegalStateException("Unsupported kind: " + getKind());
+ }
+ }
}
diff --git a/common/src/main/java/dev/cel/common/internal/BUILD.bazel b/common/src/main/java/dev/cel/common/internal/BUILD.bazel
index 690b1cc75..359ddffed 100644
--- a/common/src/main/java/dev/cel/common/internal/BUILD.bazel
+++ b/common/src/main/java/dev/cel/common/internal/BUILD.bazel
@@ -461,3 +461,10 @@ cel_android_library(
"@maven_android//:com_google_protobuf_protobuf_javalite",
],
)
+
+java_library(
+ name = "concatenated_list_view",
+ srcs = ["ConcatenatedListView.java"],
+ deps = ["//common/annotations"],
+ # used_by_android
+)
diff --git a/runtime/src/main/java/dev/cel/runtime/ConcatenatedListView.java b/common/src/main/java/dev/cel/common/internal/ConcatenatedListView.java
similarity index 92%
rename from runtime/src/main/java/dev/cel/runtime/ConcatenatedListView.java
rename to common/src/main/java/dev/cel/common/internal/ConcatenatedListView.java
index ac7696751..1fbe779f6 100644
--- a/runtime/src/main/java/dev/cel/runtime/ConcatenatedListView.java
+++ b/common/src/main/java/dev/cel/common/internal/ConcatenatedListView.java
@@ -12,8 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package dev.cel.runtime;
+package dev.cel.common.internal;
+import dev.cel.common.annotations.Internal;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
@@ -28,7 +29,8 @@
*
*
This does not support any of the standard list operations from {@link java.util.List}.
*/
-final class ConcatenatedListView extends AbstractList {
+@Internal
+public final class ConcatenatedListView extends AbstractList {
private final List> sourceLists;
private int totalSize = 0;
@@ -36,7 +38,7 @@ final class ConcatenatedListView extends AbstractList {
this.sourceLists = new ArrayList<>();
}
- ConcatenatedListView(Collection extends E> collection) {
+ public ConcatenatedListView(Collection extends E> collection) {
this();
addAll(collection);
}
diff --git a/common/src/main/java/dev/cel/common/types/BUILD.bazel b/common/src/main/java/dev/cel/common/types/BUILD.bazel
index 579fd31c5..962c351c7 100644
--- a/common/src/main/java/dev/cel/common/types/BUILD.bazel
+++ b/common/src/main/java/dev/cel/common/types/BUILD.bazel
@@ -183,6 +183,18 @@ java_library(
],
)
+java_library(
+ name = "default_type_provider",
+ srcs = [
+ "DefaultTypeProvider.java",
+ ],
+ deps = [
+ ":type_providers",
+ ":types",
+ "@maven_android//:com_google_guava_guava",
+ ],
+)
+
cel_android_library(
name = "cel_types_android",
srcs = ["CelTypes.java"],
diff --git a/common/src/main/java/dev/cel/common/types/DefaultTypeProvider.java b/common/src/main/java/dev/cel/common/types/DefaultTypeProvider.java
new file mode 100644
index 000000000..c2fd6d364
--- /dev/null
+++ b/common/src/main/java/dev/cel/common/types/DefaultTypeProvider.java
@@ -0,0 +1,54 @@
+package dev.cel.common.types;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+import java.util.Optional;
+
+public class DefaultTypeProvider implements CelTypeProvider {
+
+ private static final ImmutableMap COMMON_TYPES =
+ ImmutableMap.builder()
+ .put("bool", TypeType.create(SimpleType.BOOL))
+ .put("bytes", TypeType.create(SimpleType.BYTES))
+ .put("double", TypeType.create(SimpleType.DOUBLE))
+ .put("int", TypeType.create(SimpleType.INT))
+ .put("uint", TypeType.create(SimpleType.UINT))
+ .put("string", TypeType.create(SimpleType.STRING))
+ .put("null_type", TypeType.create(SimpleType.NULL_TYPE))
+ .put("dyn",TypeType.create(SimpleType.DYN))
+ .put("list", TypeType.create(ListType.create(SimpleType.DYN)))
+ .put("map", TypeType.create(MapType.create(SimpleType.DYN, SimpleType.DYN)))
+ .put("google.protobuf.Duration", TypeType.create(SimpleType.DURATION))
+ .put("google.protobuf.Timestamp", TypeType.create(SimpleType.TIMESTAMP))
+ .put("optional_type", TypeType.create(OptionalType.create(SimpleType.DYN))) // TODO: Move to CelOptionalLibrary
+ .buildOrThrow();
+
+ // private static final ImmutableMap, TypeType> EXTENDABLE_TYPES =
+ // ImmutableMap., TypeType>builder()
+ // .put(Collection.class, TypeType.create(ListType.create(SimpleType.DYN)))
+ // .put(ByteString.class, TypeType.create(SimpleType.BYTES))
+ // .put(Map.class, TypeType.create(MapType.create(SimpleType.DYN, SimpleType.DYN)))
+ // .buildOrThrow();
+
+ private static Map.Entry newTypeMapEntry(CelType type) {
+ return Maps.immutableEntry(type.name(), TypeType.create(type));
+ }
+
+ @Override
+ public ImmutableCollection types() {
+ return COMMON_TYPES.values();
+ }
+ @Override
+ public Optional findType(String typeName) {
+ return Optional.ofNullable(COMMON_TYPES.get(typeName));
+ }
+
+ public static DefaultTypeProvider create() {
+ return new DefaultTypeProvider();
+ }
+
+ private DefaultTypeProvider() {}
+}
diff --git a/common/src/main/java/dev/cel/common/values/BUILD.bazel b/common/src/main/java/dev/cel/common/values/BUILD.bazel
index 9ffa5bad3..efd23242e 100644
--- a/common/src/main/java/dev/cel/common/values/BUILD.bazel
+++ b/common/src/main/java/dev/cel/common/values/BUILD.bazel
@@ -131,6 +131,7 @@ java_library(
"//common/types:type_providers",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
+ "@maven//:com_google_protobuf_protobuf_java",
"@maven//:org_jspecify_jspecify",
],
)
@@ -152,6 +153,7 @@ cel_android_library(
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:org_jspecify_jspecify",
"@maven_android//:com_google_guava_guava",
+ "@maven_android//:com_google_protobuf_protobuf_javalite",
],
)
diff --git a/common/src/main/java/dev/cel/common/values/CelValueConverter.java b/common/src/main/java/dev/cel/common/values/CelValueConverter.java
index a281318f8..359f2ef5b 100644
--- a/common/src/main/java/dev/cel/common/values/CelValueConverter.java
+++ b/common/src/main/java/dev/cel/common/values/CelValueConverter.java
@@ -33,7 +33,7 @@
@SuppressWarnings("unchecked") // Unchecked cast of generics due to type-erasure (ex: MapValue).
@Internal
@Immutable
-abstract class CelValueConverter {
+public abstract class CelValueConverter {
/** Adapts a {@link CelValue} to a plain old Java Object. */
public Object fromCelValueToJavaObject(CelValue celValue) {
diff --git a/common/types/BUILD.bazel b/common/types/BUILD.bazel
index 6c2b1a269..3531edd09 100644
--- a/common/types/BUILD.bazel
+++ b/common/types/BUILD.bazel
@@ -50,6 +50,11 @@ java_library(
exports = ["//common/src/main/java/dev/cel/common/types:cel_proto_message_types"],
)
+java_library(
+ name = "default_type_provider",
+ exports = ["//common/src/main/java/dev/cel/common/types:default_type_provider"],
+)
+
java_library(
name = "cel_v1alpha1_types",
visibility = ["//:internal"],
diff --git a/runtime/BUILD.bazel b/runtime/BUILD.bazel
index b7d59ce96..78892a3ef 100644
--- a/runtime/BUILD.bazel
+++ b/runtime/BUILD.bazel
@@ -20,10 +20,18 @@ java_library(
)
java_library(
- name = "dispatcher",
+ name = "default_dispatcher",
visibility = ["//:internal"],
exports = [
- "//runtime/src/main/java/dev/cel/runtime:dispatcher",
+ "//runtime/src/main/java/dev/cel/runtime:default_dispatcher",
+ ],
+)
+
+java_library(
+ name = "legacy_dispatcher",
+ visibility = ["//:internal"],
+ exports = [
+ "//runtime/src/main/java/dev/cel/runtime:legacy_dispatcher",
],
)
@@ -220,3 +228,13 @@ cel_android_library(
visibility = ["//:internal"],
exports = ["//runtime/src/main/java/dev/cel/runtime:lite_runtime_impl_android"],
)
+
+java_library(
+ name = "cel_value_function_binding",
+ exports = ["//runtime/src/main/java/dev/cel/runtime:cel_value_function_binding"],
+)
+
+java_library(
+ name = "cel_value_function_overload",
+ exports = ["//runtime/src/main/java/dev/cel/runtime:cel_value_function_overload"],
+)
diff --git a/runtime/planner/BUILD.bazel b/runtime/planner/BUILD.bazel
new file mode 100644
index 000000000..2cc40873d
--- /dev/null
+++ b/runtime/planner/BUILD.bazel
@@ -0,0 +1,11 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+ default_applicable_licenses = ["//:license"],
+ default_visibility = ["//visibility:public"],
+)
+
+java_library(
+ name = "program_planner",
+ exports = ["//runtime/src/main/java/dev/cel/runtime/planner:program_planner"],
+)
diff --git a/runtime/src/main/java/dev/cel/runtime/Activation.java b/runtime/src/main/java/dev/cel/runtime/Activation.java
index 074a461a2..3fb7ca484 100644
--- a/runtime/src/main/java/dev/cel/runtime/Activation.java
+++ b/runtime/src/main/java/dev/cel/runtime/Activation.java
@@ -58,6 +58,7 @@ public static Activation of(final String name, Object value) {
@Override
public @Nullable Object resolve(String theName) {
if (theName.equals(name)) {
+ // TODO: Decouple
return RuntimeHelpers.maybeAdaptPrimitive(value);
}
return null;
@@ -65,6 +66,7 @@ public static Activation of(final String name, Object value) {
@Override
public String toString() {
+ // TODO: Remove.
if (value instanceof ByteString) {
ByteString bs = (ByteString) value;
StringBuilder val = new StringBuilder();
diff --git a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
index 184a01534..5fbeb579a 100644
--- a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
+++ b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
@@ -41,10 +41,14 @@ LITE_RUNTIME_SOURCES = [
# keep sorted
LITE_RUNTIME_IMPL_SOURCES = [
- "LiteProgramImpl.java",
"LiteRuntimeImpl.java",
]
+# keep sorted
+LITE_PROGRAM_IMPL_SOURCES = [
+ "LiteProgramImpl.java",
+]
+
# keep sorted
FUNCTION_BINDING_SOURCES = [
"CelFunctionBinding.java",
@@ -120,7 +124,23 @@ java_library(
)
java_library(
- name = "dispatcher",
+ name = "default_dispatcher",
+ srcs = ["CelValueDispatcher.java"],
+ tags = [
+ ],
+ deps = [
+ ":base",
+ ":cel_value_function_binding",
+ ":cel_value_function_overload",
+ "//:auto_value",
+ "//common/annotations",
+ "@maven//:com_google_errorprone_error_prone_annotations",
+ "@maven//:com_google_guava_guava",
+ ],
+)
+
+java_library(
+ name = "legacy_dispatcher",
srcs = DISPATCHER_SOURCES,
tags = [
],
@@ -139,7 +159,7 @@ java_library(
)
cel_android_library(
- name = "dispatcher_android",
+ name = "legacy_dispatcher_android",
srcs = DISPATCHER_SOURCES,
visibility = ["//visibility:private"],
deps = [
@@ -283,14 +303,13 @@ java_library(
deps = [
":accumulated_unknowns",
":base",
- ":concatenated_list_view",
- ":dispatcher",
":evaluation_exception",
":evaluation_exception_builder",
":evaluation_listener",
":function_overload_impl",
":interpretable",
":interpreter_util",
+ ":legacy_dispatcher",
":metadata",
":runtime_helpers",
":runtime_type_provider",
@@ -303,6 +322,7 @@ java_library(
"//common:runtime_exception",
"//common/annotations",
"//common/ast",
+ "//common/internal:concatenated_list_view",
"//common/types",
"//common/types:type_providers",
"//common/values:cel_byte_string",
@@ -321,14 +341,13 @@ cel_android_library(
deps = [
":accumulated_unknowns_android",
":base_android",
- ":concatenated_list_view",
- ":dispatcher_android",
":evaluation_exception",
":evaluation_exception_builder",
":evaluation_listener_android",
":function_overload_impl_android",
":interpretable_android",
":interpreter_util_android",
+ ":legacy_dispatcher_android",
":metadata",
":runtime_helpers_android",
":runtime_type_provider_android",
@@ -341,6 +360,7 @@ cel_android_library(
"//common:runtime_exception",
"//common/annotations",
"//common/ast:ast_android",
+ "//common/internal:concatenated_list_view",
"//common/types:type_providers_android",
"//common/types:types_android",
"//common/values:cel_byte_string",
@@ -416,11 +436,11 @@ cel_android_library(
tags = [
],
deps = [
- ":concatenated_list_view",
"//common:error_codes",
"//common:options",
"//common:runtime_exception",
"//common/annotations",
+ "//common/internal:concatenated_list_view",
"//common/internal:converter",
"//common/values:values_android",
"@maven//:com_google_errorprone_error_prone_annotations",
@@ -439,11 +459,11 @@ java_library(
tags = [
],
deps = [
- ":concatenated_list_view",
"//common:error_codes",
"//common:options",
"//common:runtime_exception",
"//common/annotations",
+ "//common/internal:concatenated_list_view",
"//common/internal:converter",
"//common/values",
"@maven//:com_google_errorprone_error_prone_annotations",
@@ -495,13 +515,14 @@ java_library(
tags = [
],
deps = [
- ":dispatcher",
":evaluation_exception",
":function_binding",
":function_overload",
":function_overload_impl",
":function_resolver",
+ ":legacy_dispatcher",
"//:auto_value",
+ "//common/annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
],
@@ -513,12 +534,12 @@ cel_android_library(
tags = [
],
deps = [
- ":dispatcher_android",
":evaluation_exception",
":function_binding_android",
":function_overload_android",
":function_overload_impl_android",
":function_resolver_android",
+ ":legacy_dispatcher_android",
"//:auto_value",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_guava_guava",
@@ -827,13 +848,13 @@ java_library(
":cel_value_runtime_type_provider",
":descriptor_message_provider",
":descriptor_type_resolver",
- ":dispatcher",
":evaluation_exception",
":evaluation_listener",
":function_binding",
":function_resolver",
":interpretable",
":interpreter",
+ ":legacy_dispatcher",
":lite_runtime",
":proto_message_activation_factory",
":proto_message_runtime_equality",
@@ -891,12 +912,13 @@ java_library(
deps = [
":activation",
":cel_value_runtime_type_provider",
- ":dispatcher",
":evaluation_exception",
":function_binding",
":function_resolver",
":interpretable",
":interpreter",
+ ":legacy_dispatcher",
+ ":lite_program_impl",
":lite_runtime",
":runtime_equality",
":runtime_helpers",
@@ -904,7 +926,9 @@ java_library(
"//:auto_value",
"//common:cel_ast",
"//common:options",
+ "//common/types:type_providers",
"//common/values:cel_value_provider",
+ "//runtime/planner:program_planner",
"//runtime/standard:standard_function",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
@@ -912,6 +936,24 @@ java_library(
],
)
+java_library(
+ name = "lite_program_impl",
+ srcs = LITE_PROGRAM_IMPL_SOURCES,
+ tags = [
+ ],
+ deps = [
+ ":activation",
+ ":evaluation_exception",
+ ":evaluation_listener",
+ ":function_resolver",
+ ":interpretable",
+ ":interpreter",
+ ":lite_runtime",
+ "//:auto_value",
+ "@maven//:com_google_errorprone_error_prone_annotations",
+ ],
+)
+
cel_android_library(
name = "lite_runtime_impl_android",
srcs = LITE_RUNTIME_IMPL_SOURCES,
@@ -920,13 +962,15 @@ cel_android_library(
deps = [
":activation_android",
":cel_value_runtime_type_provider_android",
- ":dispatcher_android",
":evaluation_exception",
":function_binding_android",
":function_resolver_android",
":interpretable_android",
":interpreter_android",
+ ":legacy_dispatcher_android",
+ ":lite_program_impl", # TODO - android target
":lite_runtime_android",
+ ":program_planner", # TODO - android target
":runtime_equality_android",
":runtime_helpers_android",
":type_resolver_android",
@@ -1141,13 +1185,6 @@ cel_android_library(
],
)
-java_library(
- name = "concatenated_list_view",
- srcs = ["ConcatenatedListView.java"],
- # used_by_android
- visibility = ["//visibility:private"],
-)
-
java_library(
name = "accumulated_unknowns",
srcs = ["AccumulatedUnknowns.java"],
@@ -1167,3 +1204,31 @@ cel_android_library(
"@maven//:com_google_errorprone_error_prone_annotations",
],
)
+
+java_library(
+ name = "cel_value_function_binding",
+ srcs = ["CelValueFunctionBinding.java"],
+ tags = [
+ ],
+ deps = [
+ ":cel_value_function_overload",
+ "//common/values:cel_value",
+ "@maven//:com_google_errorprone_error_prone_annotations",
+ "@maven//:com_google_guava_guava",
+ ],
+)
+
+java_library(
+ name = "cel_value_function_overload",
+ srcs = [
+ "CelValueFunctionOverload.java",
+ ],
+ tags = [
+ ],
+ deps = [
+ ":evaluation_exception",
+ "//common/values:cel_value",
+ "@maven//:com_google_errorprone_error_prone_annotations",
+ "@maven//:com_google_guava_guava",
+ ],
+)
diff --git a/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java b/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
index 8fe2b8a2e..7d7c47428 100644
--- a/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
+++ b/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
@@ -16,7 +16,6 @@
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.Immutable;
-import dev.cel.common.annotations.Internal;
/**
* Binding consisting of an overload id, a Java-native argument signature, and an overload
@@ -36,7 +35,6 @@
*
* Examples: string_startsWith_string, mathMax_list, lessThan_money_money
*/
-@Internal
@Immutable
public interface CelFunctionBinding {
String getOverloadId();
diff --git a/runtime/src/main/java/dev/cel/runtime/CelLiteRuntimeBuilder.java b/runtime/src/main/java/dev/cel/runtime/CelLiteRuntimeBuilder.java
index 48b51274d..1392da66a 100644
--- a/runtime/src/main/java/dev/cel/runtime/CelLiteRuntimeBuilder.java
+++ b/runtime/src/main/java/dev/cel/runtime/CelLiteRuntimeBuilder.java
@@ -62,6 +62,9 @@ CelLiteRuntimeBuilder setStandardFunctions(
@CanIgnoreReturnValue
CelLiteRuntimeBuilder addLibraries(Iterable extends CelLiteRuntimeLibrary> libraries);
+ @CanIgnoreReturnValue
+ CelLiteRuntimeBuilder enablePlanner(boolean value);
+
@CheckReturnValue
CelLiteRuntime build();
}
diff --git a/runtime/src/main/java/dev/cel/runtime/CelRuntime.java b/runtime/src/main/java/dev/cel/runtime/CelRuntime.java
index d730701e7..cefa2c335 100644
--- a/runtime/src/main/java/dev/cel/runtime/CelRuntime.java
+++ b/runtime/src/main/java/dev/cel/runtime/CelRuntime.java
@@ -16,6 +16,7 @@
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.Immutable;
+import dev.cel.runtime.DefaultInterpreter.DefaultInterpretable;
import javax.annotation.concurrent.ThreadSafe;
import com.google.protobuf.Message;
import dev.cel.common.CelAbstractSyntaxTree;
diff --git a/runtime/src/main/java/dev/cel/runtime/CelValueDispatcher.java b/runtime/src/main/java/dev/cel/runtime/CelValueDispatcher.java
new file mode 100644
index 000000000..403b48253
--- /dev/null
+++ b/runtime/src/main/java/dev/cel/runtime/CelValueDispatcher.java
@@ -0,0 +1,50 @@
+package dev.cel.runtime;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.CheckReturnValue;
+import dev.cel.common.annotations.Internal;
+
+import java.util.Optional;
+
+@Internal
+@AutoValue
+public abstract class CelValueDispatcher {
+
+ abstract ImmutableMap overloads();
+
+ public Optional findOverload(String overloadId) {
+ return Optional.ofNullable(overloads().get(overloadId));
+ }
+
+ public static Builder newBuilder() {
+ return new AutoValue_CelValueDispatcher.Builder();
+ }
+
+ @AutoValue.Builder
+ public abstract static class Builder {
+ public abstract ImmutableMap.Builder overloadsBuilder();
+
+ @CanIgnoreReturnValue
+ public Builder addOverload(CelValueFunctionBinding functionBinding) {
+ overloadsBuilder().put(
+ functionBinding.overloadId(),
+ functionBinding);
+ return this;
+ }
+
+ @CanIgnoreReturnValue
+ public Builder addDynamicDispatchOverload(String functionName, CelValueFunctionOverload definition) {
+ overloadsBuilder().put(
+ functionName, CelValueFunctionBinding.from(functionName, ImmutableList.of(), definition)
+ );
+
+ return this;
+ }
+
+ @CheckReturnValue
+ public abstract CelValueDispatcher build();
+ }
+}
diff --git a/runtime/src/main/java/dev/cel/runtime/CelValueFunctionBinding.java b/runtime/src/main/java/dev/cel/runtime/CelValueFunctionBinding.java
new file mode 100644
index 000000000..1fbd06c81
--- /dev/null
+++ b/runtime/src/main/java/dev/cel/runtime/CelValueFunctionBinding.java
@@ -0,0 +1,67 @@
+package dev.cel.runtime;
+
+import com.google.common.collect.ImmutableList;
+import com.google.errorprone.annotations.Immutable;
+import dev.cel.common.values.CelValue;
+
+@Immutable
+public final class CelValueFunctionBinding {
+
+ private final String overloadId;
+ private final ImmutableList> argTypes;
+ private final CelValueFunctionOverload definition;
+
+ public String overloadId() {
+ return overloadId;
+ }
+
+ public ImmutableList> argTypes() {
+ return argTypes;
+ }
+
+ public CelValueFunctionOverload definition() {
+ return definition;
+ }
+
+ public static CelValueFunctionBinding from(String overloadId, CelValueFunctionOverload.Nullary impl) {
+ return from(overloadId, ImmutableList.of(), (args) -> impl.apply());
+ }
+
+ public static CelValueFunctionBinding from(
+ String overloadId, Class argType, CelValueFunctionOverload.Unary impl) {
+ return from(overloadId, ImmutableList.of(argType), (args) -> impl.apply((T) args[0]));
+ }
+
+ public static CelValueFunctionBinding from(String overloadId, Class argType1, Class argType2, CelValueFunctionOverload.Binary impl) {
+ return from(overloadId, ImmutableList.of(argType1, argType2), (args) -> impl.apply((T1) args[0], (T2) args[1]));
+ }
+
+ public static CelValueFunctionBinding from(String overloadId, Class argType1, Class argType2, Class argType3, CelValueFunctionOverload.Ternary impl) {
+ return from(overloadId, ImmutableList.of(argType1, argType2, argType3), (args) -> impl.apply((T1) args[0], (T2) args[1], (T3) args[2]));
+ }
+
+ public static CelValueFunctionBinding from(String overloadId, ImmutableList> argTypes, CelValueFunctionOverload impl) {
+ return new CelValueFunctionBinding(overloadId, argTypes, impl);
+ }
+
+ public boolean canHandle(CelValue[] arguments) {
+ if (argTypes().size() != arguments.length) {
+ return false;
+ }
+
+ for (int i = 0; i < argTypes().size(); i++) {
+ Class extends CelValue> paramType = argTypes().get(i);
+ CelValue arg = arguments[i];
+ if (!paramType.isInstance(arg)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private CelValueFunctionBinding(String overloadId, ImmutableList> argTypes, CelValueFunctionOverload definition) {
+ this.overloadId = overloadId;
+ this.argTypes = argTypes;
+ this.definition = definition;
+ }
+}
diff --git a/runtime/src/main/java/dev/cel/runtime/CelValueFunctionOverload.java b/runtime/src/main/java/dev/cel/runtime/CelValueFunctionOverload.java
new file mode 100644
index 000000000..8ac8d256f
--- /dev/null
+++ b/runtime/src/main/java/dev/cel/runtime/CelValueFunctionOverload.java
@@ -0,0 +1,31 @@
+package dev.cel.runtime;
+
+import com.google.errorprone.annotations.Immutable;
+import dev.cel.common.values.CelValue;
+
+@Immutable
+@FunctionalInterface
+public interface CelValueFunctionOverload {
+
+ CelValue apply(CelValue... args) throws CelEvaluationException;
+
+ @Immutable
+ interface Nullary {
+ CelValue apply() throws CelEvaluationException;
+ }
+
+ @Immutable
+ interface Unary {
+ CelValue apply(T arg) throws CelEvaluationException;
+ }
+
+ @Immutable
+ interface Binary {
+ CelValue apply(T1 arg1, T2 arg2) throws CelEvaluationException;
+ }
+
+ @Immutable
+ interface Ternary {
+ CelValue apply(T1 arg1, T2 arg2, T3 arg3) throws CelEvaluationException;
+ }
+}
diff --git a/runtime/src/main/java/dev/cel/runtime/DefaultDispatcher.java b/runtime/src/main/java/dev/cel/runtime/DefaultDispatcher.java
index 1b89939ea..efa7613bb 100644
--- a/runtime/src/main/java/dev/cel/runtime/DefaultDispatcher.java
+++ b/runtime/src/main/java/dev/cel/runtime/DefaultDispatcher.java
@@ -22,6 +22,8 @@
import javax.annotation.concurrent.ThreadSafe;
import com.google.errorprone.annotations.concurrent.GuardedBy;
import dev.cel.common.CelErrorCode;
+import dev.cel.common.annotations.Internal;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -34,7 +36,8 @@
* Should be final, do not mock; mocking {@link Dispatcher} instead.
*/
@ThreadSafe
-final class DefaultDispatcher implements Dispatcher, Registrar {
+@Internal
+public final class DefaultDispatcher implements Dispatcher, Registrar {
public static DefaultDispatcher create() {
return new DefaultDispatcher();
}
diff --git a/runtime/src/main/java/dev/cel/runtime/DefaultInterpreter.java b/runtime/src/main/java/dev/cel/runtime/DefaultInterpreter.java
index afdca0e3e..ef2986e29 100644
--- a/runtime/src/main/java/dev/cel/runtime/DefaultInterpreter.java
+++ b/runtime/src/main/java/dev/cel/runtime/DefaultInterpreter.java
@@ -146,14 +146,12 @@ public Object eval(GlobalResolver resolver) throws CelEvaluationException {
RuntimeUnknownResolver.fromResolver(resolver), Optional.empty(), Optional.empty());
}
- @Override
public Object eval(GlobalResolver resolver, CelEvaluationListener listener)
throws CelEvaluationException {
return evalTrackingUnknowns(
RuntimeUnknownResolver.fromResolver(resolver), Optional.empty(), Optional.of(listener));
}
- @Override
public Object eval(GlobalResolver resolver, FunctionResolver lateBoundFunctionResolver)
throws CelEvaluationException {
return evalTrackingUnknowns(
@@ -162,7 +160,6 @@ public Object eval(GlobalResolver resolver, FunctionResolver lateBoundFunctionRe
Optional.empty());
}
- @Override
public Object eval(
GlobalResolver resolver,
FunctionResolver lateBoundFunctionResolver,
@@ -940,14 +937,14 @@ private IntermediateResult maybeAdaptToListView(IntermediateResult accuValue) {
return accuValue;
}
- ConcatenatedListView