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); }
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); }
/// <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); }
/// <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); }
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); } } } }
/// <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); }