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