Skip to content

Commit a1d76e4

Browse files
dmitriplotnikovcopybara-github
authored andcommitted
Update the "protos" extension to be compatible with CelEnvironmentExporter
PiperOrigin-RevId: 788724386
1 parent 143ceb8 commit a1d76e4

5 files changed

Lines changed: 53 additions & 6 deletions

File tree

bundle/src/main/java/dev/cel/bundle/CelEnvironmentExporter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,9 @@ public Builder addStandardExtensions(CelOptions options) {
115115
addExtensionLibraries(
116116
CelExtensions.getExtensionLibrary("bindings", options),
117117
CelExtensions.getExtensionLibrary("encoders", options),
118+
CelExtensions.getExtensionLibrary("lists", options),
118119
CelExtensions.getExtensionLibrary("math", options),
119-
CelExtensions.getExtensionLibrary("lists", options));
120+
CelExtensions.getExtensionLibrary("protos", options));
120121
// TODO: add support for remaining standard extensions
121122
return this;
122123
}

extensions/src/main/java/dev/cel/extensions/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ java_library(
101101
"//common/ast",
102102
"//common/internal",
103103
"//compiler:compiler_builder",
104+
"//extensions:extension_library",
104105
"//parser:macro",
105106
"//parser:parser_builder",
106107
"@maven//:com_google_errorprone_error_prone_annotations",

extensions/src/main/java/dev/cel/extensions/CelExtensions.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,12 @@ public static CelExtensionLibrary<? extends CelExtensionLibrary.FeatureSet> getE
307307
return CelBindingsExtensions.library();
308308
case "encoders":
309309
return CelEncoderExtensions.library();
310-
case "math":
311-
return CelMathExtensions.library(options);
312310
case "lists":
313311
return CelListsExtensions.library();
312+
case "math":
313+
return CelMathExtensions.library(options);
314+
case "protos":
315+
return CelProtoExtensions.library();
314316
// TODO: add support for remaining standard extensions
315317
default:
316318
throw new IllegalArgumentException("Unknown standard extension '" + name + "'");

extensions/src/main/java/dev/cel/extensions/CelProtoExtensions.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static com.google.common.base.Preconditions.checkNotNull;
1919

2020
import com.google.common.collect.ImmutableList;
21+
import com.google.common.collect.ImmutableSet;
2122
import com.google.errorprone.annotations.Immutable;
2223
import dev.cel.common.CelIssue;
2324
import dev.cel.common.ast.CelExpr;
@@ -30,18 +31,47 @@
3031

3132
/** Internal implementation of CEL proto extensions. */
3233
@Immutable
33-
final class CelProtoExtensions implements CelCompilerLibrary {
34+
final class CelProtoExtensions implements CelCompilerLibrary, CelExtensionLibrary.FeatureSet {
3435

3536
private static final String PROTO_NAMESPACE = "proto";
3637
private static final CelExpr ERROR = CelExpr.newBuilder().setConstant(Constants.ERROR).build();
3738

39+
private static final CelExtensionLibrary<CelProtoExtensions> LIBRARY =
40+
new CelExtensionLibrary<CelProtoExtensions>() {
41+
private final CelProtoExtensions version0 = new CelProtoExtensions();
42+
43+
@Override
44+
public String name() {
45+
return "protos";
46+
}
47+
48+
@Override
49+
public ImmutableSet<CelProtoExtensions> versions() {
50+
return ImmutableSet.of(version0);
51+
}
52+
};
53+
54+
static CelExtensionLibrary<CelProtoExtensions> library() {
55+
return LIBRARY;
56+
}
57+
3858
@Override
39-
public void setParserOptions(CelParserBuilder parserBuilder) {
40-
parserBuilder.addMacros(
59+
public int version() {
60+
return 0;
61+
}
62+
63+
@Override
64+
public ImmutableSet<CelMacro> macros() {
65+
return ImmutableSet.of(
4166
CelMacro.newReceiverMacro("hasExt", 2, CelProtoExtensions::expandHasProtoExt),
4267
CelMacro.newReceiverMacro("getExt", 2, CelProtoExtensions::expandGetProtoExt));
4368
}
4469

70+
@Override
71+
public void setParserOptions(CelParserBuilder parserBuilder) {
72+
parserBuilder.addMacros(macros());
73+
}
74+
4575
private static Optional<CelExpr> expandHasProtoExt(
4676
CelMacroExprFactory exprFactory, CelExpr target, ImmutableList<CelExpr> arguments) {
4777
return expandProtoExt(exprFactory, target, arguments, true);

extensions/src/test/java/dev/cel/extensions/CelProtoExtensionsTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import dev.cel.common.CelAbstractSyntaxTree;
3131
import dev.cel.common.CelContainer;
3232
import dev.cel.common.CelFunctionDecl;
33+
import dev.cel.common.CelOptions;
3334
import dev.cel.common.CelOverloadDecl;
3435
import dev.cel.common.CelValidationException;
3536
import dev.cel.common.types.SimpleType;
@@ -40,6 +41,7 @@
4041
import dev.cel.expr.conformance.proto2.TestAllTypes;
4142
import dev.cel.expr.conformance.proto2.TestAllTypes.NestedEnum;
4243
import dev.cel.expr.conformance.proto2.TestAllTypesExtensions;
44+
import dev.cel.parser.CelMacro;
4345
import dev.cel.parser.CelStandardMacro;
4446
import dev.cel.runtime.CelFunctionBinding;
4547
import dev.cel.runtime.CelRuntime;
@@ -85,6 +87,17 @@ public final class CelProtoExtensionsTest {
8587
.setExtension(Proto2ExtensionScopedMessage.int64Ext, 1L)
8688
.build();
8789

90+
@Test
91+
public void library() {
92+
CelExtensionLibrary<?> library =
93+
CelExtensions.getExtensionLibrary("protos", CelOptions.DEFAULT);
94+
assertThat(library.name()).isEqualTo("protos");
95+
assertThat(library.latest().version()).isEqualTo(0);
96+
assertThat(library.version(0).functions()).isEmpty();
97+
assertThat(library.version(0).macros().stream().map(CelMacro::getFunction))
98+
.containsExactly("hasExt", "getExt");
99+
}
100+
88101
@Test
89102
@TestParameters("{expr: 'proto.hasExt(msg, cel.expr.conformance.proto2.int32_ext)'}")
90103
@TestParameters("{expr: 'proto.hasExt(msg, cel.expr.conformance.proto2.nested_ext)'}")

0 commit comments

Comments
 (0)