Esempio n. 1
0
        /// <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);
    }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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));
        }