Skip to content

Commit abbd7cf

Browse files
committed
Override fromWellKnownProto in ProtoLiteCelValueConverter for FieldMask
Mirror the full converter: intercept FIELD_MASK in the lite converter and wrap it as a ProtoMessageLiteValue so it is navigable as a message on the lite runtime. Adds a lite-converter test.
1 parent b9e7639 commit abbd7cf

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

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

Lines changed: 17 additions & 1 deletion
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;
@@ -178,12 +179,27 @@ public Object toRuntimeValue(Object value) {
178179
return ProtoMessageLiteValue.create(msg, descriptor.getProtoTypeName(), this);
179180
}
180181

181-
return super.fromWellKnownProto(msg, wellKnownProto);
182+
return fromWellKnownProto(msg, wellKnownProto);
182183
}
183184

184185
return super.toRuntimeValue(value);
185186
}
186187

188+
@Override
189+
protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wellKnownProto) {
190+
if (wellKnownProto == WellKnownProto.FIELD_MASK) {
191+
MessageLite message = (MessageLite) msg;
192+
MessageLiteDescriptor descriptor =
193+
descriptorPool
194+
.findDescriptor(message)
195+
.orElseThrow(
196+
() -> new NoSuchElementException("Could not find a descriptor for: " + message));
197+
return ProtoMessageLiteValue.create(message, descriptor.getProtoTypeName(), this);
198+
}
199+
200+
return super.fromWellKnownProto(msg, wellKnownProto);
201+
}
202+
187203
private Object getDefaultValue(FieldLiteDescriptor fieldDescriptor) {
188204
EncodingType encodingType = fieldDescriptor.getEncodingType();
189205
switch (encodingType) {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.protobuf.DoubleValue;
2828
import com.google.protobuf.Duration;
2929
import com.google.protobuf.ExtensionRegistryLite;
30+
import com.google.protobuf.FieldMask;
3031
import com.google.protobuf.FloatValue;
3132
import com.google.protobuf.Int32Value;
3233
import com.google.protobuf.Int64Value;
@@ -104,6 +105,17 @@ public void fromProtoMessageToCelValue_withWellKnownProto_convertsToPrimitivesFr
104105
assertThat(adaptedValue).isEqualTo(testCase.value);
105106
}
106107

108+
@Test
109+
public void fromProtoMessageToCelValue_fieldMask_returnsProtoMessageLiteValue() {
110+
FieldMask fieldMask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build();
111+
112+
Object adaptedValue = PROTO_LITE_CEL_VALUE_CONVERTER.toRuntimeValue(fieldMask);
113+
114+
assertThat(adaptedValue).isInstanceOf(ProtoMessageLiteValue.class);
115+
assertThat(((ProtoMessageLiteValue) adaptedValue).select("paths"))
116+
.isEqualTo(ImmutableList.of("foo", "bar"));
117+
}
118+
107119
/** Test cases for repeated_int64: 1L,2L,3L */
108120
@SuppressWarnings("ImmutableEnumChecker") // Test only
109121
private enum RepeatedFieldBytesTestCase {

0 commit comments

Comments
 (0)