func byteToValueString(b []byte, lastReadIndex int, t FieldDescriptorProto_Type) (string, int) { var val string // All the types of options switch t { case FieldDescriptorProto_TYPE_BOOL: d, _ := proto.DecodeVarint(b[lastReadIndex:]) if int(d) == 1 { val = "true" } else { val = "false" } lastReadIndex += 1 case FieldDescriptorProto_TYPE_UINT32, FieldDescriptorProto_TYPE_INT32, FieldDescriptorProto_TYPE_UINT64, FieldDescriptorProto_TYPE_INT64: d, m := proto.DecodeVarint(b[lastReadIndex:]) lastReadIndex += m //fmt.Printf("m: %v\n", m) val = fmt.Sprintf("%v", d) case FieldDescriptorProto_TYPE_FLOAT, FieldDescriptorProto_TYPE_SFIXED32, FieldDescriptorProto_TYPE_FIXED32: var f float32 binary.Read(bytes.NewBuffer(b[lastReadIndex:]), binary.LittleEndian, &f) lastReadIndex += 1 val = fmt.Sprintf("%v", f) case FieldDescriptorProto_TYPE_DOUBLE, FieldDescriptorProto_TYPE_SFIXED64, FieldDescriptorProto_TYPE_FIXED64: var f float64 binary.Read(bytes.NewBuffer(b[lastReadIndex:]), binary.LittleEndian, &f) lastReadIndex += 1 val = fmt.Sprintf("%v", f) case FieldDescriptorProto_TYPE_STRING: l, n := proto.DecodeVarint(b[lastReadIndex:]) lastReadIndex += n val = `"` + string(b[lastReadIndex:lastReadIndex+int(l)]) + `"` lastReadIndex += int(l) } return val, lastReadIndex }
func getFormattedOptionsFromExtensionMap(extensionMap map[int32]proto.Extension, depth int, fieldOption bool, pathIncludingParent string) string { var s []string counter := 0 if len(extensionMap) > 0 { commentsIndex := 0 for optInd := range extensionMap { // Loop through all imported files for _, curFile := range allFiles { extensions := curFile.GetExtension() // Loop through extensions in the FileDescriptorProto for _, ext := range extensions { if ext.GetNumber() == optInd { bytes, _ := proto.GetRawExtension(extensionMap, optInd) key, n := proto.DecodeVarint(bytes) wt := key & 0x7 var val string // Enums are special if ext.GetType() == FieldDescriptorProto_TYPE_ENUM { // Loop through enums to find right one for _, myEnum := range curFile.GetEnumType() { if myEnum.GetName() == getLastWordFromPath(ext.GetTypeName(), ".") { for _, enumVal := range myEnum.GetValue() { d, _ := proto.DecodeVarint(bytes[n:]) if uint64(enumVal.GetNumber()) == d { val = enumVal.GetName() } } } } s = append(s, LeadingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1)) if !fieldOption { s = append(s, getIndentation(depth+1)) s = append(s, `option (`) } else { if counter >= 1 { s = append(s, ", ") } s = append(s, `(`) } if curFile.GetName() != currentFile.GetName() && len(curFile.GetPackage()) > 0 { s = append(s, curFile.GetPackage()) s = append(s, ".") } s = append(s, ext.GetName()) s = append(s, ") = ") s = append(s, val) if !fieldOption { s = append(s, ";\n") } comm := TrailingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1) if len(comm) > 0 { s = append(s, comm) if counter < len(extensionMap)-1 { s = append(s, "\n") } } commentsIndex += 1 counter += 1 } else if wt == 2 && ext.GetType() != FieldDescriptorProto_TYPE_STRING { // Messages are special (for method options) payload, m := proto.DecodeVarint(bytes[n:]) n += m //fmt.Printf("payload: %v\n", payload) for ind := uint64(0); ind < payload-1; ind += 1 { firstInt, a := proto.DecodeVarint(bytes[n:]) n += a wiretype := firstInt & 0x7 var packType FieldDescriptorProto_Type switch wiretype { case 0: packType = FieldDescriptorProto_TYPE_INT32 case 1: packType = FieldDescriptorProto_TYPE_FIXED64 case 2: packType = FieldDescriptorProto_TYPE_STRING case 5: packType = FieldDescriptorProto_TYPE_FIXED32 } packVal, b := byteToValueString(bytes, n, packType) n += b //fmt.Printf("%v\n", packVal) if ext.GetType() == FieldDescriptorProto_TYPE_MESSAGE { tagNum := firstInt >> 3 //fmt.Printf("tagnum: %v\n", tagNum) // Loop through messages to find right one myMessage := curFile.GetMessage(getLastWordFromPath(ext.GetTypeName(), ".")) //fmt.Println(myMessage.GetName()) for _, field := range myMessage.GetField() { if uint64(field.GetNumber()) == tagNum { val = `.` + field.GetName() + " = " + packVal } } } s = append(s, LeadingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1)) if !fieldOption { s = append(s, getIndentation(depth+1)) s = append(s, `option (`) } else { if counter >= 1 { s = append(s, ", ") } s = append(s, `(`) } if curFile.GetName() != currentFile.GetName() && len(curFile.GetPackage()) > 0 { s = append(s, curFile.GetPackage()) s = append(s, ".") } s = append(s, ext.GetName()) s = append(s, ")") s = append(s, val) if !fieldOption { s = append(s, ";\n") } comm := TrailingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1) if len(comm) > 0 { s = append(s, comm) if counter < len(extensionMap) { s = append(s, "\n") } } commentsIndex += 1 counter += 1 } } else { val, _ = byteToValueString(bytes, n, ext.GetType()) s = append(s, LeadingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1)) if !fieldOption { s = append(s, getIndentation(depth+1)) s = append(s, `option (`) } else { if counter >= 1 { s = append(s, ", ") } s = append(s, `(`) } if curFile.GetName() != currentFile.GetName() && len(curFile.GetPackage()) > 0 { s = append(s, curFile.GetPackage()) s = append(s, ".") } s = append(s, ext.GetName()) s = append(s, ") = ") s = append(s, val) if !fieldOption { s = append(s, ";\n") } comm := TrailingComments(fmt.Sprintf("%s,%d,%d", pathIncludingParent, 999, commentsIndex), depth+1) if len(comm) > 0 { s = append(s, comm) if counter < len(extensionMap) { s = append(s, "\n") } } commentsIndex += 1 counter += 1 } } } } } } return strings.Join(s, "") }