public CEnum Convert(CProtoEnum protoEnum)
        {
            var e = new CEnum()
            {
                EnumName = $"{protoEnum.EnumName}"
            };

            foreach (var v in protoEnum.EnumValue)
            {
                e.EnumValues.Add(new CEnumValue()
                {
                    EnumValueName = v.EnumValueName, EnumValue = v.EnumValueNumber
                });
            }

            return(e);
        }
        public KProtoFile Convert(string protoFileName, string protoFileContent)
        {
            //1. save file to temp folder
            //2. run protoc compiler, convert to C# class
            //3. Compile the code in memory
            //4. Read the .Descriptor
            //5. Converto SProtoFile
            var codePath      = GenerateCodeFromProto(protoFileContent);
            var code          = GetGeneratedCode(codePath);
            var assembly      = CompileCodeToAssembly(code);
            var descriptors   = GetFileDescriptorsFromAssembly(assembly);
            var messagesAdded = new List <CProtoMessage>();
            var protoFile     = new CProtoFile();

            protoFile.SourceProtoText = protoFileContent;

            foreach (var descriptorPair in descriptors)
            {
                var descriptor = descriptorPair.Value;
                protoFile.CSharpNamespace = descriptorPair.Key;

                protoFile.Import.Add("google/protobuf/timestamp.proto");
                protoFile.Import.Add("google/protobuf/duration.proto");
                protoFile.Import.Add("google/protobuf/descriptor.proto");

                protoFile.Option.Add($@"csharp_namespace = ""{protoFile.CSharpNamespace}"";");
                protoFile.Option.Add($@"(version) = ""1.0.0"";");

                foreach (var service in descriptor.Services)
                {
                    var protoService = new CProtoService(protoFile)
                    {
                        ServiceName = service.Name
                    };
                    foreach (var method in service.Methods)
                    {
                        var protoServiceMethod = new CProtoRpc(protoService)
                        {
                            RpcName = method.Name
                        };
                        protoService.Rpc.Add(protoServiceMethod);
                        protoServiceMethod.Request = new CProtoMessage(protoServiceMethod)
                        {
                            MessageName = method.InputType.Name
                        };
                        messagesAdded.Add(protoServiceMethod.Request);

                        foreach (var field in method.InputType.Fields.InFieldNumberOrder())
                        {
                            //protoServiceMethod.Request.ProtoField.Add(BuildProtoMessageField(field));
                            ProcessField(field, descriptor, protoServiceMethod.Request, messagesAdded);
                        }

                        protoServiceMethod.Response = new CProtoMessage(protoServiceMethod)
                        {
                            MessageName = method.OutputType.Name
                        };
                        messagesAdded.Add(protoServiceMethod.Response);
                        foreach (var field in method.OutputType.Fields.InFieldNumberOrder())
                        {
                            //protoServiceMethod.Response.ProtoField.Add(BuildProtoMessageField(field));
                            ProcessField(field, descriptor, protoServiceMethod.Response, messagesAdded);
                        }
                    }
                    protoFile.ProtoService.Add(protoService);
                }
                foreach (var enumType in descriptor.EnumTypes)
                {
                    if (protoFile.ProtoEnum.Exists(pe => pe.EnumName == enumType.Name))
                    {
                        continue;
                    }
                    var protoEnum = new CProtoEnum {
                        EnumName = enumType.Name
                    };
                    foreach (var enumTypeItem in enumType.Values)
                    {
                        var enumValue = new CProtoEnumValue
                        {
                            EnumValueName   = enumTypeItem.Name,
                            EnumValueNumber = enumTypeItem.Number
                        };
                        protoEnum.EnumValue.Add(enumValue);
                    }
                    protoFile.ProtoEnum.Add(protoEnum);
                }
                foreach (var message in descriptor.MessageTypes)
                {
                    if (messagesAdded.Exists(pm => pm.MessageName == message.Name))
                    {
                        continue;
                    }
                    var protoMessage = new CProtoMessage(null)
                    {
                        MessageName = message.Name
                    };

                    foreach (var field in message.Fields.InFieldNumberOrder())
                    {
                        ProcessField(field, descriptor, protoMessage, messagesAdded);
                    }

                    protoFile.ProtoMessage.Add(protoMessage);
                    messagesAdded.Add(protoMessage);
                }
                foreach (var dependency in descriptor.Dependencies)
                {
                    foreach (var message in dependency.MessageTypes)
                    {
                        if (messagesAdded.Exists(pm => pm.MessageName == message.Name))
                        {
                            continue;
                        }
                        var protoMessage = new CProtoMessage(null)
                        {
                            MessageName = message.Name, IsExternal = true
                        };
                        protoFile.ProtoMessage.Add(protoMessage);
                        messagesAdded.Add(protoMessage);
                    }
                }
            }
            return(new KProtoFile
            {
                ProtoFileFile = protoFileName,
                GeneratedProtoFile = protoFile
            });
        }