Esempio n. 1
0
        private List <JsonField> AddEmptyFieldsAndArrays(ProtoParsedMessage protoParsedMessage)
        {
            var listOfData = new List <JsonField>();

            listOfData.AddRange(GetFieldsFromProtoMessage(protoParsedMessage));

            foreach (var message in protoParsedMessage.Messages)
            {
                var tempJsonModel = new JsonField
                {
                    Name      = message.Name,
                    IsVisible = true,
                    DataType  = "array"
                };

                if (message.IsRepeated)
                {
                    tempJsonModel.Arrays.Add(AddEmptyFieldsAndArrays(message));
                }

                else
                {
                    tempJsonModel.Fields.AddRange(AddEmptyFieldsAndArrays(message));
                }

                listOfData.Add(tempJsonModel);
            }

            // fix the indexes
            FixIndex(listOfData);

            return(listOfData);
        }
Esempio n. 2
0
        private static IEnumerable <JsonField> GetFieldsFromProtoMessage(ProtoParsedMessage protoParsedMessage)
        {
            EnsureArg.IsNotNull(protoParsedMessage);
            var list = new List <JsonField>();

            foreach (var field in protoParsedMessage.Fields)
            {
                var clonedField = field.Copy();
                var jsonField   = new JsonField()
                {
                    Name  = clonedField.Name,
                    Value = clonedField.IsRepeated ? new List <object>()
                    {
                        clonedField.DefaultValue
                    } : clonedField.Value,
                    Min             = clonedField.Min,
                    Max             = clonedField.Max,
                    DataType        = clonedField.DataType,
                    DefaultValue    = clonedField.DefaultValue,
                    IsVisible       = false,
                    IsRepeated      = clonedField.IsRepeated,
                    IsFieldRepeated = clonedField.IsRepeated
                };

                list.Add(jsonField);
            }

            return(list);
        }
Esempio n. 3
0
        /// <summary>
        /// Formats the specified protoParsedMessage as Proto parser protoParsedMessage.
        /// </summary>
        /// <param name="message">The protoParsedMessage to format.</param>
        /// <param name="protoParserProtoParsedMessage">The field to parse the formatted protoParsedMessage to.</param>
        /// <returns>The formatted protoParsedMessage.</returns>
        public ProtoParsedMessage Format(IMessage message, ProtoParsedMessage protoParserProtoParsedMessage)
        {
            EnsureArg.IsNotNull(message, nameof(message));
            EnsureArg.IsNotNull(protoParserProtoParsedMessage, nameof(protoParserProtoParsedMessage));

            ProcessMessageFields(protoParserProtoParsedMessage, message);
            return(protoParserProtoParsedMessage);
        }
Esempio n. 4
0
        /// <summary>
        /// Formats the specified protoParsedMessage as JSON.
        /// </summary>
        /// <param name="message">The protoParsedMessage to format.</param>
        /// <returns>The formatted protoParsedMessage.</returns>
        public ProtoParsedMessage Format(IMessage message)
        {
            EnsureArg.IsNotNull(message);

            var protoParserMessage = new ProtoParsedMessage();

            Format(message, protoParserMessage);

            return(protoParserMessage);
        }
Esempio n. 5
0
        private void ProcessMessageFields(ProtoParsedMessage protoParserProtoParsedMessage, IMessage message)
        {
            var fieldCollection = message.Descriptor.Fields.InFieldNumberOrder();

            for (var tempIndex = 0; tempIndex < fieldCollection.Count; tempIndex++)
            {
                if (fieldCollection[tempIndex].FieldType == FieldType.Message)
                {
                    var temp = new ProtoParsedMessage
                    {
                        Id         = tempIndex,
                        Name       = fieldCollection[tempIndex].Name,
                        IsRepeated = fieldCollection[tempIndex].IsRepeated
                    };

                    protoParserProtoParsedMessage.Messages.Add(temp);

                    IMessage cleanSubMessage = fieldCollection[tempIndex].MessageType.Parser.ParseFrom(ByteString.Empty);
                    ProcessMessageFields(temp, cleanSubMessage);
                }
                else
                {
                    var field = InitFieldValues(fieldCollection[tempIndex]);

                    if (field != null)
                    {
                        field.Id   = tempIndex;
                        field.Name = fieldCollection[tempIndex].Name;

                        if (fieldCollection[tempIndex].FieldType == FieldType.Enum)
                        {
                            var firstValue = fieldCollection[tempIndex].EnumType.Values.First();
                            var lastValue  = fieldCollection[tempIndex].EnumType.Values.Last();

                            field.Min = firstValue.Number;
                            field.Max = lastValue.Number;
                        }

                        protoParserProtoParsedMessage.Fields.Add(field);
                    }
                }
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Merges the toml with proto message.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configValues">The configuration values.</param>
        /// <param name="protoParsedMessage">The proto parsed message.</param>
        /// <returns></returns>
        public List <JsonField> MergeTomlWithProtoMessage <T>(T configValues, ProtoParsedMessage protoParsedMessage) where T : Dictionary <string, object>
        {
            var listOfData = new List <JsonField>();

            // add fields, repeated and non-repeated messages to the list
            // in case there is no data, just return fields, repeated and non-repeated messages
            // as basic data.
            listOfData.AddRange(AddEmptyFieldsAndArrays(protoParsedMessage));
            foreach (var dicItem in configValues.Select((kvp, index) => new { Kvp = kvp, Index = index }))
            {
                var field = listOfData.FirstOrDefault(x =>
                                                      string.Equals(x.Name, dicItem.Kvp.Key, StringComparison.OrdinalIgnoreCase) && x.DataType != "array");

                if (field != null)
                {
                    field.Value           = field.IsRepeated ? GetRepeatedFieldValue(dicItem.Kvp.Value) : GetFieldValue(dicItem.Kvp.Value);
                    field.IsVisible       = true;
                    field.IsFieldRepeated = field.IsRepeated;
                }

                // we have a repeated / non repeated protoParsedMessage.
                else
                {
                    var message = protoParsedMessage.Messages.FirstOrDefault(x => string.Equals(x.Name, dicItem.Kvp.Key, StringComparison.OrdinalIgnoreCase));

                    if (message != null)
                    {
                        var tempJsonModel = new JsonField
                        {
                            Name      = message.Name,
                            IsVisible = true,
                            DataType  = "array"
                        };
                        var jsonField = listOfData.RemoveAll(x => x.Name == message.Name);

                        if (dicItem.Kvp.Value is T[] repeatedValues)
                        {
                            repeatedValues.ToList().ForEach(item =>
                                                            tempJsonModel.Arrays.Add(MergeTomlWithProtoMessage(item, message)));
                        }
                        else if (dicItem.Kvp.Value is T nonRepeatedValues)
                        {
                            var subArrayData = MergeTomlWithProtoMessage(nonRepeatedValues, message);
                            tempJsonModel.Fields.AddRange(subArrayData);
                        }
                        else
                        {
                            tempJsonModel.IsVisible = false;
                            if (message.IsRepeated)
                            {
                                tempJsonModel.Arrays.Add(MergeTomlWithProtoMessage(new Dictionary <string, object>(), message));
                            }

                            else
                            {
                                tempJsonModel.Fields.AddRange(MergeTomlWithProtoMessage(new Dictionary <string, object>(), message));
                            }
                        }

                        listOfData.Add(tempJsonModel);
                    }
                }
            }

            // fix the indexes
            FixIndex(listOfData);
            return(listOfData);
        }