Wrap FieldMask via shared message-to-struct hook on the base converter · cel-expr/cel-java@984193b · GitHub
Skip to content

Commit 984193b

Browse files
committed
Wrap FieldMask via shared message-to-struct hook on the base converter
Move the FieldMask case into BaseProtoCelValueConverter, delegating to a new fromProtoMessageToStructValue hook that both the full and lite converters implement. This reuses the existing non-well-known message wrapping path (removing the duplicated ProtoMessageValue.create call) and extends the fix to the lite runtime. Adds a lite-converter test.
1 parent 95faaa8 commit 984193b

4 files changed

Lines changed: 38 additions & 18 deletions

File tree

common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java

Lines changed: 7 additions & 13 deletions

common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,17 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wel
7171
"Unpacking failed for message: " + message.getDescriptorForType().getFullName(), e);
7272
}
7373
return toRuntimeValue(unpackedMessage);
74-
case FIELD_MASK:
75-
return ProtoMessageValue.create(
76-
(Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames());
7774
default:
7875
return super.fromWellKnownProto(message, wellKnownProto);
7976
}
8077
}
8178

79+
@Override
80+
protected ProtoMessageValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) {
81+
return ProtoMessageValue.create(
82+
(Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames());
83+
}
84+
8285
@Override
8386
public Object toRuntimeValue(Object value) {
8487
if (value instanceof EnumValueDescriptor) {
@@ -102,8 +105,7 @@ public Object toRuntimeValue(Object value) {
102105
WellKnownProto wellKnownProto =
103106
WellKnownProto.getByTypeName(message.getDescriptorForType().getFullName()).orElse(null);
104107
if (wellKnownProto == null) {
105-
return ProtoMessageValue.create(
106-
message, celDescriptorPool, this, celOptions.enableJsonFieldNames());
108+
return fromProtoMessageToStructValue(message);
107109
}
108110

109111
return fromWellKnownProto(message, wellKnownProto);

common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.protobuf.CodedInputStream;
2929
import com.google.protobuf.ExtensionRegistryLite;
3030
import com.google.protobuf.MessageLite;
31+
import com.google.protobuf.MessageLiteOrBuilder;
3132
import com.google.protobuf.WireFormat;
3233
import dev.cel.common.annotations.Internal;
3334
import dev.cel.common.internal.CelLiteDescriptorPool;
@@ -184,6 +185,17 @@ public Object toRuntimeValue(Object value) {
184185
return super.toRuntimeValue(value);
185186
}
186187

188+
@Override
189+
protected ProtoMessageLiteValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) {
190+
MessageLite msg = (MessageLite) message;
191+
MessageLiteDescriptor descriptor =
192+
descriptorPool
193+
.findDescriptor(msg)
194+
.orElseThrow(
195+
() -> new NoSuchElementException("Could not find a descriptor for: " + msg));
196+
return ProtoMessageLiteValue.create(msg, descriptor.getProtoTypeName(), this);
197+
}
198+
187199
private Object getDefaultValue(FieldLiteDescriptor fieldDescriptor) {
188200
EncodingType encodingType = fieldDescriptor.getEncodingType();
189201
switch (encodingType) {

common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java

Lines changed: 12 additions & 0 deletions

0 commit comments

Comments
 (0)