/// <summary> /// Checks whether paths in a given fields mask are valid. /// </summary> public static bool IsValid(MessageDescriptor descriptor, string path) { var parts = path.Split(FIELD_SEPARATOR_REGEX); if (parts.Length == 0) { return(false); } foreach (var name in parts) { var field = descriptor?.FindFieldByName(name); if (field == null) { return(false); } if (!field.IsRepeated && field.FieldType == FieldType.Message) { descriptor = field.MessageType; } else { descriptor = null; } } return(true); }
public static bool TryResolveDescriptors(MessageDescriptor messageDescriptor, IList <string> path, [NotNullWhen(true)] out List <FieldDescriptor>?fieldDescriptors) { fieldDescriptors = null; MessageDescriptor?currentDescriptor = messageDescriptor; foreach (var fieldName in path) { var field = currentDescriptor?.FindFieldByName(fieldName); if (field == null) { fieldDescriptors = null; return(false); } if (fieldDescriptors == null) { fieldDescriptors = new List <FieldDescriptor>(); } fieldDescriptors.Add(field); if (field.FieldType == FieldType.Message) { currentDescriptor = field.MessageType; } else { currentDescriptor = null; } } return(fieldDescriptors != null); }
public void TestFieldPresenceReflection() { MessageDescriptor descriptor = TestAllTypes.Descriptor; FieldDescriptor optionalInt32Field = descriptor.FindFieldByName("optional_int32"); FieldDescriptor optionalStringField = descriptor.FindFieldByName("optional_string"); FieldDescriptor optionalBytesField = descriptor.FindFieldByName("optional_bytes"); FieldDescriptor optionalNestedEnumField = descriptor.FindFieldByName("optional_nested_enum"); FieldDescriptor oneofUint32Field = descriptor.FindFieldByName("oneof_uint32"); TestAllTypes message = TestAllTypes.CreateBuilder().Build(); Assert.IsFalse(message.HasField(optionalInt32Field)); Assert.IsFalse(message.HasField(optionalStringField)); Assert.IsFalse(message.HasField(optionalBytesField)); Assert.IsFalse(message.HasField(optionalNestedEnumField)); // Set to default value is seen as not present for optional fields. // Set to default value is seen as present for oneof fields. message = TestAllTypes.CreateBuilder() .SetOptionalInt32(0) .SetOptionalString("") .SetOptionalBytes(ByteString.Empty) .SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO) .SetOneofUint32(0U) .Build(); Assert.IsFalse(message.HasField(optionalInt32Field)); Assert.IsFalse(message.HasField(optionalStringField)); Assert.IsFalse(message.HasField(optionalBytesField)); Assert.IsFalse(message.HasField(optionalNestedEnumField)); Assert.IsTrue(message.HasField(oneofUint32Field)); Assert.AreEqual(1, message.AllFields.Count); // Set to non-defalut value is seen as present message = TestAllTypes.CreateBuilder() .SetOptionalInt32(1) .SetOptionalString("x") .SetOptionalBytes(ByteString.CopyFromUtf8("y")) .SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.BAR) .Build(); Assert.IsTrue(message.HasField(optionalInt32Field)); Assert.IsTrue(message.HasField(optionalStringField)); Assert.IsTrue(message.HasField(optionalBytesField)); Assert.IsTrue(message.HasField(optionalNestedEnumField)); Assert.AreEqual(4, message.AllFields.Count); }
private static MemberDeclarationSyntax PaginatedPartialInterfaceClass(SourceFileContext ctx, Typ typ, MessageDescriptor messageDesc) { var partialInterfaceCls = Class(Public | Partial, typ, baseTypes: ctx.Type <IPageRequest>()); if (messageDesc.FindFieldByName("page_size") is null) { //DiREGapic scenario where `max_results` is an option for a page size-semantic field. var maxResMessage = messageDesc.FindFieldByName("max_results"); if (maxResMessage is null) { throw new InvalidOperationException("Paginated request should have either page_size or max_results field."); } using (ctx.InClass(partialInterfaceCls)) { var underlyingProperty = Property(DontCare, ctx.TypeDontCare, "MaxResults"); var getBody = ProtoTyp.Of(maxResMessage) == Typ.Of <int>() ? Return(underlyingProperty) : Return(CheckedCast(ctx.Type <int>(), underlyingProperty)); var assignFrom = ProtoTyp.Of(maxResMessage) == Typ.Of <int>() ? Value : CheckedCast(ctx.Type(ProtoTyp.Of(maxResMessage)), Value); var setBody = underlyingProperty.Assign(assignFrom); var property = Property(Public, ctx.Type <int>(), "PageSize") .WithGetBody(getBody) .WithSetBody(setBody) .WithXmlDoc(XmlDoc.InheritDoc); partialInterfaceCls = partialInterfaceCls.AddMembers(property); } } return(partialInterfaceCls); }
public void CustomOptions() { MessageDescriptor descriptor = TestMessageWithCustomOptions.Descriptor; Assert.IsTrue(descriptor.Options.HasExtension(UnittestCustomOptions.MessageOpt1)); Assert.AreEqual(-56, descriptor.Options.GetExtension(UnittestCustomOptions.MessageOpt1)); FieldDescriptor field = descriptor.FindFieldByName("field1"); Assert.NotNull(field); Assert.IsTrue(field.Options.HasExtension(UnittestCustomOptions.FieldOpt1)); Assert.AreEqual(8765432109uL, field.Options.GetExtension(UnittestCustomOptions.FieldOpt1)); }
public static bool TryResolveDescriptors(MessageDescriptor messageDescriptor, string variable, [NotNullWhen(true)] out List <FieldDescriptor>?fieldDescriptors) { fieldDescriptors = null; var path = variable.AsSpan(); MessageDescriptor?currentDescriptor = messageDescriptor; while (path.Length > 0) { var separator = path.IndexOf('.'); string fieldName; if (separator != -1) { fieldName = path.Slice(0, separator).ToString(); path = path.Slice(separator + 1); } else { fieldName = path.ToString(); path = ReadOnlySpan <char> .Empty; } var field = currentDescriptor?.FindFieldByName(fieldName); if (field == null) { fieldDescriptors = null; return(false); } if (fieldDescriptors == null) { fieldDescriptors = new List <FieldDescriptor>(); } fieldDescriptors.Add(field); if (field.FieldType == FieldType.Message) { currentDescriptor = field.MessageType; } else { currentDescriptor = null; } } return(fieldDescriptors != null); }
public void CustomOptions() { MessageDescriptor descriptor = TestMessageWithCustomOptions.Descriptor; Assert.IsTrue(descriptor.Options.HasExtension(UnitTestCustomOptionsProtoFile.MessageOpt1)); Assert.AreEqual(-56, descriptor.Options.GetExtension(UnitTestCustomOptionsProtoFile.MessageOpt1)); FieldDescriptor field = descriptor.FindFieldByName("field1"); Assert.IsNotNull(field); Assert.IsTrue(field.Options.HasExtension(UnitTestCustomOptionsProtoFile.FieldOpt1)); Assert.AreEqual(8765432109uL, field.Options.GetExtension(UnitTestCustomOptionsProtoFile.FieldOpt1)); // TODO: Write out enum descriptors /* * EnumDescriptor enumType = TestMessageWithCustomOptions.Types. * UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor(); * * Assert.IsTrue( * enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1)); * Assert.AreEqual(Integer.valueOf(-789), * enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1)); */ ServiceDescriptor service = TestGenericServiceWithCustomOptions.Descriptor; Assert.IsTrue(service.Options.HasExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1)); Assert.AreEqual(-9876543210L, service.Options.GetExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1)); MethodDescriptor method = service.FindMethodByName("Foo"); Assert.IsNotNull(method); Assert.IsTrue(method.Options.HasExtension(UnitTestCustomOptionsProtoFile.MethodOpt1)); Assert.AreEqual(MethodOpt1.METHODOPT1_VAL2, method.Options.GetExtension(UnitTestCustomOptionsProtoFile.MethodOpt1)); }