func (d *deepCopyGen) genRepeatedWriter(m *generator.Descriptor, f *descriptor.FieldDescriptorProto, notNullablePrefix string) func() { fName := generator.CamelCase(*f.Name) if gogoproto.IsCustomName(f) { fName = gogoproto.GetCustomName(f) } typename, _ := d.gen.GoType(m, f) isMessage := f.IsMessage() repeatedFunc := func() { d.gen.P("\tif m.", fName, " != nil {") d.gen.P("\t\to.", fName, " = make(", typename, ", 0, len(m.", fName, "))") if isMessage { d.gen.P("\t\tfor _, v := range m.", fName, " {") d.gen.P("\t\t\to.", fName, " = append(o.", fName, ", ", notNullablePrefix, "v.Copy())") d.gen.P("\t\t}") } else { d.gen.P("\t\to.", fName, " = append(o.", fName, ", m.", fName, "...)") } d.gen.P("\t}") d.gen.P() } return repeatedFunc }
func (p *plugin) hasLoop(field *descriptor.FieldDescriptorProto, visited []*generator.Descriptor, excludes []*generator.Descriptor) *generator.Descriptor { if field.IsMessage() || p.IsGroup(field) { fieldMessage := p.ObjectNamed(field.GetTypeName()).(*generator.Descriptor) fieldTypeName := generator.CamelCaseSlice(fieldMessage.TypeName()) for _, message := range visited { messageTypeName := generator.CamelCaseSlice(message.TypeName()) if fieldTypeName == messageTypeName { for _, e := range excludes { if fieldTypeName == generator.CamelCaseSlice(e.TypeName()) { return nil } } return fieldMessage } } for _, f := range fieldMessage.Field { visited = append(visited, fieldMessage) loopTo := p.hasLoop(f, visited, excludes) if loopTo != nil { return loopTo } } } return nil }
func (d *deepCopyGen) genMapWriter(m *generator.Descriptor, f *descriptor.FieldDescriptorProto, notNullablePrefix string) func() { fName := generator.CamelCase(*f.Name) if gogoproto.IsCustomName(f) { fName = gogoproto.GetCustomName(f) } dv := d.gen.ObjectNamed(f.GetTypeName()) if desc, ok := dv.(*generator.Descriptor); ok && desc.GetOptions().GetMapEntry() { mt := d.gen.GoMapType(desc, f) typename := mt.GoType valueIsMessage := mt.ValueField.IsMessage() mapfunc := func() { d.gen.P("\tif m.", fName, " != nil {") d.gen.P("\t\to.", fName, " = make(", typename, ")") d.gen.P("\t\tfor k, v := range m.", fName, " {") if valueIsMessage { d.gen.P("\t\t\to.", fName, "[k] = ", notNullablePrefix, "v.Copy()") } else { d.gen.P("\t\t\to.", fName, "[k] = v") } d.gen.P("\t\t}") d.gen.P("\t}") d.gen.P() } return mapfunc } return nil }
func (d *deepCopyGen) genOneOfWriter(m *generator.Descriptor, f *descriptor.FieldDescriptorProto, oneOfFuncs map[string][]func()) { ccTypeName := generator.CamelCaseSlice(m.TypeName()) fName := generator.CamelCase(*f.Name) if gogoproto.IsCustomName(f) { fName = gogoproto.GetCustomName(f) } odp := m.OneofDecl[int(*f.OneofIndex)] oneOfName := generator.CamelCase(odp.GetName()) oneOfNameFuncs, ok := oneOfFuncs[oneOfName] if !ok { oneOfFunc := func() { d.gen.P("\tswitch m.", oneOfName, ".(type) {") } oneOfNameFuncs = append(oneOfNameFuncs, oneOfFunc) } isMessage := f.IsMessage() oneOfFunc := func() { tName := ccTypeName + "_" + fName d.gen.P("\tcase *", tName, ":") d.gen.P("\t\ti := &", tName, " {") if isMessage { d.gen.P("\t\t\t", fName, ": m.Get", fName, "().Copy(),") } else { d.gen.P("\t\t\t", fName, ": m.Get", fName, "(),") } d.gen.P("\t\t}") d.gen.P() d.gen.P("\t\to.", oneOfName, " = i") } oneOfNameFuncs = append(oneOfNameFuncs, oneOfFunc) oneOfFuncs[oneOfName] = oneOfNameFuncs }
func (d *deepCopyGen) genRepeated(m *generator.Descriptor, f *descriptor.FieldDescriptorProto) { fName := generator.CamelCase(*f.Name) if gogoproto.IsCustomName(f) { fName = gogoproto.GetCustomName(f) } typename, _ := d.GoType(m, f) d.P("if o.", fName, " != nil {") d.In() if f.IsMessage() { d.P("m.", fName, " = make(", typename, ", len(o.", fName, "))") // TODO(stevvooe): Handle custom type here? goType := d.TypeName(d.ObjectNamed(f.GetTypeName())) // elides [] or * d.P("for i := range m.", fName, " {") d.In() if !gogoproto.IsNullable(f) { d.genCopyFunc("&m."+fName+"[i]", "&o."+fName+"[i]") } else { d.P("m.", fName, "[i] = &", goType, "{}") d.genCopyFunc("m."+fName+"[i]", "o."+fName+"[i]") } d.Out() d.P("}") } else { d.P("m.", fName, " = make(", typename, ", len(o.", fName, "))") d.P("copy(m.", fName, ", ", "o.", fName, ")") } d.Out() d.P("}") d.P() }
func ProtoToType(field *descriptor.FieldDescriptorProto) Type { decType := Decoded(ProtoToEncodedType(field.GetType())) if !field.IsRepeated() { return decType } return Type(int32(decType) + 100) }
func isFloat(f *descriptor.FieldDescriptorProto) bool { switch f.GetType() { case descriptor.FieldDescriptorProto_TYPE_DOUBLE, descriptor.FieldDescriptorProto_TYPE_FLOAT: return true } return false }
func TurnOffNullableForNativeTypesWithoutDefaultsOnly(field *descriptor.FieldDescriptorProto) { if field.IsRepeated() || field.IsMessage() { return } if field.DefaultValue != nil { return } SetBoolFieldOption(gogoproto.E_Nullable, false)(field) }
func NeedsNilCheck(proto3 bool, field *google_protobuf.FieldDescriptorProto) bool { nullable := IsNullable(field) if field.IsMessage() || IsCustomType(field) { return nullable } if proto3 { return false } return nullable || *field.Type == google_protobuf.FieldDescriptorProto_TYPE_BYTES }
func (g *Generator) IsMap(field *descriptor.FieldDescriptorProto) bool { if !field.IsMessage() { return false } byName := g.ObjectNamed(field.GetTypeName()) desc, ok := byName.(*Descriptor) if byName == nil || !ok || !desc.GetOptions().GetMapEntry() { return false } return true }
func (this *visitor) AddTrans(srcToken int, field *descriptor.FieldDescriptorProto, dstToken int) { input := field.GetKeyUint64() if _, ok := this.trans[srcToken]; !ok { this.trans[srcToken] = make(map[uint64]int) } if _, ok := this.trans[srcToken][input]; ok { panic("transition already exists") } this.trans[srcToken][input] = dstToken this.types[dstToken] = *field.Type }
func (p *plugin) getEnumVal(field *descriptor.FieldDescriptorProto, goTyp string) string { enum := p.ObjectNamed(field.GetTypeName()).(*generator.EnumDescriptor) l := len(enum.Value) values := make([]string, l) for i := range enum.Value { values[i] = strconv.Itoa(int(*enum.Value[i].Number)) } arr := "[]int32{" + strings.Join(values, ",") + "}" val := strings.Join([]string{generator.GoTypeToName(goTyp), `(`, arr, `[r.Intn(`, fmt.Sprintf("%d", l), `)])`}, "") return val }
func isNumber(f *descriptor.FieldDescriptorProto) bool { switch f.GetType() { case descriptor.FieldDescriptorProto_TYPE_INT32, descriptor.FieldDescriptorProto_TYPE_INT64, descriptor.FieldDescriptorProto_TYPE_SINT32, descriptor.FieldDescriptorProto_TYPE_SINT64, descriptor.FieldDescriptorProto_TYPE_UINT32, descriptor.FieldDescriptorProto_TYPE_UINT64: return true } return false }
// fixFieldName changes field names like // 'id' -> 'ID' func fixFieldName(field *gogo.FieldDescriptorProto) { if gogoproto.IsCustomName(field) { return // Skip if a custom name is specified. } if field.Options == nil { field.Options = new(gogo.FieldOptions) } name := field.GetName() name = snaker.SnakeToCamel(name) name = lintName(name) // Use gogoproto.customname proto.SetExtension(field.Options, gogoproto.E_Customname, &name) }
// GoMapValueTypes returns the map value Go type and the alias map value Go type (for casting), taking into // account whether the map is nullable or the value is a message. func GoMapValueTypes(mapField, valueField *descriptor.FieldDescriptorProto, goValueType, goValueAliasType string) (nullable bool, outGoType string, outGoAliasType string) { nullable = gogoproto.IsNullable(mapField) && (valueField.IsMessage() || gogoproto.IsCustomType(mapField)) if nullable { // ensure the non-aliased Go value type is a pointer for consistency if strings.HasPrefix(goValueType, "*") { outGoType = goValueType } else { outGoType = "*" + goValueType } outGoAliasType = goValueAliasType } else { outGoType = strings.Replace(goValueType, "*", "", 1) outGoAliasType = strings.Replace(goValueAliasType, "*", "", 1) } return }
func CustomBuildField(fileDescriptorSet *descriptor.FileDescriptorSet, msg *descriptor.DescriptorProto, f *descriptor.FieldDescriptorProto, help string, proto3 bool) string { fieldname := f.GetName() if fieldname != "WeirdName" { return BuildField(fileDescriptorSet, msg, f, help, proto3) } s := `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + `: </label><div class="col-sm-10">'; s += '<select class="form-control" name="` + fieldname + `">'; ` stringOptions := []string{"option1", "another string", "192.168.1.1"} for _, stringOption := range stringOptions { s += `s += '<option value="` + stringOption + `" ' + selected("` + stringOption + `", json["` + fieldname + `"]) + '>` + stringOption + `</option>'; ` } s += `s += '</select></div></div>'; ` return s }
func (g *Generator) GetMapValueField(field, valField *descriptor.FieldDescriptorProto) *descriptor.FieldDescriptorProto { if gogoproto.IsCustomType(field) && gogoproto.IsCastValue(field) { g.Fail("cannot have a customtype and casttype: ", field.String()) } valField = proto.Clone(valField).(*descriptor.FieldDescriptorProto) if valField.Options == nil { valField.Options = &descriptor.FieldOptions{} } stdtime := gogoproto.IsStdTime(field) if stdtime { if err := proto.SetExtension(valField.Options, gogoproto.E_Stdtime, &stdtime); err != nil { g.Fail(err.Error()) } } stddur := gogoproto.IsStdDuration(field) if stddur { if err := proto.SetExtension(valField.Options, gogoproto.E_Stdduration, &stddur); err != nil { g.Fail(err.Error()) } } if valType := gogoproto.GetCastValue(field); len(valType) > 0 { if err := proto.SetExtension(valField.Options, gogoproto.E_Casttype, &valType); err != nil { g.Fail(err.Error()) } } if valType := gogoproto.GetCustomType(field); len(valType) > 0 { if err := proto.SetExtension(valField.Options, gogoproto.E_Customtype, &valType); err != nil { g.Fail(err.Error()) } } nullable := gogoproto.IsNullable(field) if err := proto.SetExtension(valField.Options, gogoproto.E_Nullable, &nullable); err != nil { g.Fail(err.Error()) } return valField }
func (d *deepCopyGen) genMap(m *generator.Descriptor, f *descriptor.FieldDescriptorProto) bool { fName := generator.CamelCase(*f.Name) if gogoproto.IsCustomName(f) { fName = gogoproto.GetCustomName(f) } dv := d.ObjectNamed(f.GetTypeName()) desc, ok := dv.(*generator.Descriptor) if !ok || !desc.GetOptions().GetMapEntry() { return false } mt := d.GoMapType(desc, f) typename := mt.GoType d.P("if o.", fName, " != nil {") d.In() d.P("m.", fName, " = make(", typename, ", ", "len(o.", fName, "))") d.P("for k, v := range o.", fName, " {") d.In() if mt.ValueField.IsMessage() { if !gogoproto.IsNullable(f) { d.P("n := ", d.TypeName(d.ObjectNamed(mt.ValueField.GetTypeName())), "{}") d.genCopyFunc("&n", "&v") d.P("m.", fName, "[k] = ", "n") } else { d.P("m.", fName, "[k] = &", d.TypeName(d.ObjectNamed(mt.ValueField.GetTypeName())), "{}") d.genCopyFunc("m."+fName+"[k]", "v") } } else { d.P("m.", fName, "[k] = v") } d.Out() d.P("}") d.Out() d.P("}") d.P() return true }
func newSingleField(desc protoparser.DescMap, f *descriptor.FieldDescriptorProto) fieldEncoder { switch f.GetType() { case descriptor.FieldDescriptorProto_TYPE_DOUBLE: return newDoubleField(f) case descriptor.FieldDescriptorProto_TYPE_FLOAT: return newFloatField(f) case descriptor.FieldDescriptorProto_TYPE_INT64: return newIntField(f) case descriptor.FieldDescriptorProto_TYPE_UINT64: return newUintField(f) case descriptor.FieldDescriptorProto_TYPE_INT32: return newIntField(f) case descriptor.FieldDescriptorProto_TYPE_FIXED64: return newFixed64UintField(f) case descriptor.FieldDescriptorProto_TYPE_FIXED32: return newFixed32UintField(f) case descriptor.FieldDescriptorProto_TYPE_BOOL: return newBoolField(f) case descriptor.FieldDescriptorProto_TYPE_STRING: return newStringField(f) case descriptor.FieldDescriptorProto_TYPE_MESSAGE: return newMsgField(desc, f, desc.LookupMessage(f)) case descriptor.FieldDescriptorProto_TYPE_BYTES: return newBytesField(f) case descriptor.FieldDescriptorProto_TYPE_UINT32: return newUintField(f) case descriptor.FieldDescriptorProto_TYPE_ENUM: return newIntField(f) case descriptor.FieldDescriptorProto_TYPE_SFIXED32: return newFixed32IntField(f) case descriptor.FieldDescriptorProto_TYPE_SFIXED64: return newFixed64IntField(f) case descriptor.FieldDescriptorProto_TYPE_SINT32: return newSint32Field(f) case descriptor.FieldDescriptorProto_TYPE_SINT64: return newSint64Field(f) } panic("unsupported field type " + f.GetType().String()) }
func (g *Generator) GetMapKeyField(field, keyField *descriptor.FieldDescriptorProto) *descriptor.FieldDescriptorProto { if !gogoproto.IsCastKey(field) { return keyField } keyField = proto.Clone(keyField).(*descriptor.FieldDescriptorProto) if keyField.Options == nil { keyField.Options = &descriptor.FieldOptions{} } keyType := gogoproto.GetCastKey(field) if err := proto.SetExtension(keyField.Options, gogoproto.E_Casttype, &keyType); err != nil { g.Fail(err.Error()) } return keyField }
func GetMap(file *descriptor.FileDescriptorProto, field *descriptor.FieldDescriptorProto) *descriptor.DescriptorProto { if !field.IsMessage() { return nil } typeName := strings.TrimPrefix(field.GetTypeName(), "."+file.GetPackage()+".") if strings.Contains(typeName, "Map") && !strings.HasSuffix(typeName, "Entry") { typeName += "." + CamelCase(field.GetName()) + "Entry" } return file.GetMessage(typeName) }
func (g *Generator) GetMapValueField(field, valField *descriptor.FieldDescriptorProto) *descriptor.FieldDescriptorProto { if !gogoproto.IsCastValue(field) && gogoproto.IsNullable(field) { return valField } valField = proto.Clone(valField).(*descriptor.FieldDescriptorProto) if valField.Options == nil { valField.Options = &descriptor.FieldOptions{} } if valType := gogoproto.GetCastValue(field); len(valType) > 0 { if err := proto.SetExtension(valField.Options, gogoproto.E_Casttype, &valType); err != nil { g.Fail(err.Error()) } } nullable := gogoproto.IsNullable(field) if err := proto.SetExtension(valField.Options, gogoproto.E_Nullable, &nullable); err != nil { g.Fail(err.Error()) } return valField }
func GetMap(file *descriptor.FileDescriptorProto, field *descriptor.FieldDescriptorProto) *descriptor.DescriptorProto { if !field.IsMessage() { return nil } typeName := field.GetTypeName() if strings.Contains(typeName, "Map") && !strings.HasSuffix(typeName, "Entry") { typeName += "." + CamelCase(field.GetName()) + "Entry" } ts := strings.Split(typeName, ".") if len(ts) == 1 { return file.GetMessage(typeName) } newTypeName := strings.Join(ts[2:], ".") return file.GetMessage(newTypeName) }
func (p *plugin) hasLoop(field *descriptor.FieldDescriptorProto, visited []*generator.Descriptor, excludes []*generator.Descriptor) *generator.Descriptor { if field.IsMessage() || p.IsGroup(field) || p.IsMap(field) { var fieldMessage *generator.Descriptor if p.IsMap(field) { m := p.GoMapType(nil, field) if !m.ValueField.IsMessage() { return nil } fieldMessage = p.ObjectNamed(m.ValueField.GetTypeName()).(*generator.Descriptor) } else { fieldMessage = p.ObjectNamed(field.GetTypeName()).(*generator.Descriptor) } fieldTypeName := generator.CamelCaseSlice(fieldMessage.TypeName()) for _, message := range visited { messageTypeName := generator.CamelCaseSlice(message.TypeName()) if fieldTypeName == messageTypeName { for _, e := range excludes { if fieldTypeName == generator.CamelCaseSlice(e.TypeName()) { return nil } } return fieldMessage } } pkg := strings.Split(field.GetTypeName(), ".")[1] for _, f := range fieldMessage.Field { if strings.HasPrefix(f.GetTypeName(), "."+pkg+".") { visited = append(visited, fieldMessage) loopTo := p.hasLoop(f, visited, excludes) if loopTo != nil { return loopTo } } } } return nil }
func (p *unmarshal) field(file *descriptor.FileDescriptorProto, field *descriptor.FieldDescriptorProto, fieldname string, proto3 bool) { repeated := field.IsRepeated() nullable := gogoproto.IsNullable(field) switch *field.Type { case descriptor.FieldDescriptorProto_TYPE_DOUBLE: if !p.unsafe { p.P(`var v uint64`) p.decodeFixed64("v", "uint64") if repeated { p.P(`v2 := `, p.mathPkg.Use(), `.Float64frombits(v)`) p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v2)`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = `, p.mathPkg.Use(), `.Float64frombits(v)`) } else { p.P(`v2 := `, p.mathPkg.Use(), `.Float64frombits(v)`) p.P(`m.`, fieldname, ` = &v2`) } } else { if repeated { p.P(`var v float64`) p.unsafeFixed64("v", "float64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed64(`m.`+fieldname, "float64") } else { p.P(`var v float64`) p.unsafeFixed64("v", "float64") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_FLOAT: if !p.unsafe { p.P(`var v uint32`) p.decodeFixed32("v", "uint32") if repeated { p.P(`v2 := `, p.mathPkg.Use(), `.Float32frombits(v)`) p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v2)`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = `, p.mathPkg.Use(), `.Float32frombits(v)`) } else { p.P(`v2 := `, p.mathPkg.Use(), `.Float32frombits(v)`) p.P(`m.`, fieldname, ` = &v2`) } } else { if repeated { p.P(`var v float32`) p.unsafeFixed32("v", "float32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed32("m."+fieldname, "float32") } else { p.P(`var v float32`) p.unsafeFixed32("v", "float32") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_INT64: if repeated { p.P(`var v int64`) p.decodeVarint("v", "int64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeVarint("m."+fieldname, "int64") } else { p.P(`var v int64`) p.decodeVarint("v", "int64") p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_UINT64: if repeated { p.P(`var v uint64`) p.decodeVarint("v", "uint64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeVarint("m."+fieldname, "uint64") } else { p.P(`var v uint64`) p.decodeVarint("v", "uint64") p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_INT32: if repeated { p.P(`var v int32`) p.decodeVarint("v", "int32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeVarint("m."+fieldname, "int32") } else { p.P(`var v int32`) p.decodeVarint("v", "int32") p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_FIXED64: if !p.unsafe { if repeated { p.P(`var v uint64`) p.decodeFixed64("v", "uint64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeFixed64("m."+fieldname, "uint64") } else { p.P(`var v uint64`) p.decodeFixed64("v", "uint64") p.P(`m.`, fieldname, ` = &v`) } } else { if repeated { p.P(`var v uint64`) p.unsafeFixed64("v", "uint64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed64("m."+fieldname, "uint64") } else { p.P(`var v uint64`) p.unsafeFixed64("v", "uint64") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_FIXED32: if !p.unsafe { if repeated { p.P(`var v uint32`) p.decodeFixed32("v", "uint32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeFixed32("m."+fieldname, "uint32") } else { p.P(`var v uint32`) p.decodeFixed32("v", "uint32") p.P(`m.`, fieldname, ` = &v`) } } else { if repeated { p.P(`var v uint32`) p.unsafeFixed32("v", "uint32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed32("m."+fieldname, "uint32") } else { p.P(`var v uint32`) p.unsafeFixed32("v", "uint32") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_BOOL: p.P(`var v int`) p.decodeVarint("v", "int") if repeated { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, bool(v != 0))`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = bool(v != 0)`) } else { p.P(`b := bool(v != 0)`) p.P(`m.`, fieldname, ` = &b`) } case descriptor.FieldDescriptorProto_TYPE_STRING: p.P(`var stringLen uint64`) p.decodeVarint("stringLen", "uint64") p.P(`postIndex := iNdEx + int(stringLen)`) p.P(`if postIndex > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) if repeated { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, string(data[iNdEx:postIndex]))`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = string(data[iNdEx:postIndex])`) } else { p.P(`s := string(data[iNdEx:postIndex])`) p.P(`m.`, fieldname, ` = &s`) } p.P(`iNdEx = postIndex`) case descriptor.FieldDescriptorProto_TYPE_GROUP: panic(fmt.Errorf("unmarshaler does not support group %v", fieldname)) case descriptor.FieldDescriptorProto_TYPE_MESSAGE: desc := p.ObjectNamed(field.GetTypeName()) msgname := p.TypeName(desc) p.P(`var msglen int`) p.decodeVarint("msglen", "int") p.P(`postIndex := iNdEx + msglen`) p.P(`if postIndex > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) if generator.IsMap(file, field) { mapMsg := generator.GetMap(file, field) keyField, valueField := mapMsg.GetMapFields() keygoTyp, _ := p.GoType(nil, keyField) keygoTyp = strings.Replace(keygoTyp, "*", "", 1) valuegoTyp, _ := p.GoType(nil, valueField) if !valueField.IsMessage() { valuegoTyp = strings.Replace(valuegoTyp, "*", "", 1) } p.P(`var keykey uint64`) p.decodeVarint("keykey", "uint64") p.mapField("mapkey", keyField) p.P(`var valuekey uint64`) p.decodeVarint("valuekey", "uint64") p.mapField("mapvalue", valueField) p.P(`if m.`, fieldname, ` == nil {`) p.In() p.P(`m.`, fieldname, ` = make(map[`, keygoTyp, `]`, valuegoTyp, `)`) p.Out() p.P(`}`) p.P(`m.`, fieldname, `[mapkey] = mapvalue`) } else if repeated { if nullable { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, &`, msgname, `{})`) } else { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, `, msgname, `{})`) } p.P(`if err := m.`, fieldname, `[len(m.`, fieldname, `)-1].Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } else if nullable { p.P(`if m.`, fieldname, ` == nil {`) p.In() p.P(`m.`, fieldname, ` = &`, msgname, `{}`) p.Out() p.P(`}`) p.P(`if err := m.`, fieldname, `.Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } else { p.P(`if err := m.`, fieldname, `.Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } p.P(`iNdEx = postIndex`) case descriptor.FieldDescriptorProto_TYPE_BYTES: p.P(`var byteLen int`) p.decodeVarint("byteLen", "int") p.P(`postIndex := iNdEx + byteLen`) p.P(`if postIndex > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) if !gogoproto.IsCustomType(field) { if repeated { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, make([]byte, postIndex-iNdEx))`) p.P(`copy(m.`, fieldname, `[len(m.`, fieldname, `)-1], data[iNdEx:postIndex])`) } else { p.P(`m.`, fieldname, ` = append([]byte{}`, `, data[iNdEx:postIndex]...)`) } } else { _, ctyp, err := generator.GetCustomType(field) if err != nil { panic(err) } if repeated { p.P(`var v `, ctyp) p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) p.P(`if err := m.`, fieldname, `[len(m.`, fieldname, `)-1].Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } else if nullable { p.P(`var v `, ctyp) p.P(`m.`, fieldname, ` = &v`) p.P(`if err := m.`, fieldname, `.Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } else { p.P(`if err := m.`, fieldname, `.Unmarshal(data[iNdEx:postIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) } } p.P(`iNdEx = postIndex`) case descriptor.FieldDescriptorProto_TYPE_UINT32: if repeated { p.P(`var v uint32`) p.decodeVarint("v", "uint32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeVarint("m."+fieldname, "uint32") } else { p.P(`var v uint32`) p.decodeVarint("v", "uint32") p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_ENUM: typName := p.TypeName(p.ObjectNamed(field.GetTypeName())) if repeated { p.P(`var v `, typName) p.decodeVarint("v", typName) p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeVarint("m."+fieldname, typName) } else { p.P(`var v `, typName) p.decodeVarint("v", typName) p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_SFIXED32: if !p.unsafe { if repeated { p.P(`var v int32`) p.decodeFixed32("v", "int32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeFixed32("m."+fieldname, "int32") } else { p.P(`var v int32`) p.decodeFixed32("v", "int32") p.P(`m.`, fieldname, ` = &v`) } } else { if repeated { p.P(`var v int32`) p.unsafeFixed32("v", "int32") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed32("m."+fieldname, "int32") } else { p.P(`var v int32`) p.unsafeFixed32("v", "int32") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_SFIXED64: if !p.unsafe { if repeated { p.P(`var v int64`) p.decodeFixed64("v", "int64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.decodeFixed64("m."+fieldname, "int64") } else { p.P(`var v int64`) p.decodeFixed64("v", "int64") p.P(`m.`, fieldname, ` = &v`) } } else { if repeated { p.P(`var v int64`) p.unsafeFixed64("v", "int64") p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.unsafeFixed64("m."+fieldname, "int64") } else { p.P(`var v int64`) p.unsafeFixed64("v", "int64") p.P(`m.`, fieldname, ` = &v`) } } case descriptor.FieldDescriptorProto_TYPE_SINT32: p.P(`var v int32`) p.decodeVarint("v", "int32") p.P(`v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31))`) if repeated { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, v)`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = v`) } else { p.P(`m.`, fieldname, ` = &v`) } case descriptor.FieldDescriptorProto_TYPE_SINT64: p.P(`var v uint64`) p.decodeVarint("v", "uint64") p.P(`v = (v >> 1) ^ uint64((int64(v&1)<<63)>>63)`) if repeated { p.P(`m.`, fieldname, ` = append(m.`, fieldname, `, int64(v))`) } else if proto3 || !nullable { p.P(`m.`, fieldname, ` = int64(v)`) } else { p.P(`v2 := int64(v)`) p.P(`m.`, fieldname, ` = &v2`) } default: panic("not implemented") } }
func (p *plugin) GenerateField(file *generator.FileDescriptor, message *generator.Descriptor, field *descriptor.FieldDescriptorProto) { proto3 := gogoproto.IsProto3(file.FileDescriptorProto) goTyp, _ := p.GoType(message, field) fieldname := p.GetFieldName(message, field) goTypName := generator.GoTypeToName(goTyp) if generator.IsMap(file.FileDescriptorProto, field) { mapmsg := generator.GetMap(file.FileDescriptorProto, field) mapkey, mapvalue := mapmsg.GetMapFields() keygoTyp, _ := p.GoType(nil, mapkey) valuegoTyp, _ := p.GoType(nil, mapvalue) keytypName := generator.GoTypeToName(keygoTyp) valuetypName := generator.GoTypeToName(valuegoTyp) mapvaluegoType := valuegoTyp if !mapvalue.IsMessage() { mapvaluegoType = strings.Replace(mapvaluegoType, "*", "", 1) } p.P(p.varGen.Next(), ` := r.Intn(10)`) p.P(`this.`, fieldname, ` = make(map[`, strings.Replace(keygoTyp, "*", "", 1), `]`, mapvaluegoType, `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() keyval := "" if mapkey.IsString() { keyval = fmt.Sprintf("randString%v(r)", p.localName) } else { keyval = value(keytypName) } if mapvalue.IsMessage() || p.IsGroup(field) { s := `this.` + fieldname + `[` + keyval + `]` + ` = ` goTypName := generator.GoTypeToName(valuegoTyp) funcCall := getFuncCall(goTypName) s += funcCall p.P(s) } else if mapvalue.IsEnum() { s := `this.` + fieldname + `[` + keyval + `]` + ` = ` + p.getEnumVal(mapvalue, valuegoTyp) p.P(s) } else if mapvalue.IsBytes() { count := p.varGen.Next() p.P(count, ` := r.Intn(100)`) p.P(p.varGen.Next(), ` := `, keyval) p.P(`this.`, fieldname, `[`, p.varGen.Current(), `] = make(`, valuegoTyp, `, `, count, `)`) p.P(`for i := 0; i < `, count, `; i++ {`) p.In() p.P(`this.`, fieldname, `[`, p.varGen.Current(), `][i] = byte(r.Intn(256))`) p.Out() p.P(`}`) } else if mapvalue.IsString() { s := `this.` + fieldname + `[` + keyval + `]` + ` = ` + fmt.Sprintf("randString%v(r)", p.localName) p.P(s) } else { p.P(p.varGen.Next(), ` := `, keyval) p.P(`this.`, fieldname, `[`, p.varGen.Current(), `] = `, value(valuetypName)) if negative(valuetypName) { p.P(`if r.Intn(2) == 0 {`) p.In() p.P(`this.`, fieldname, `[`, p.varGen.Current(), `] *= -1`) p.Out() p.P(`}`) } } p.Out() p.P(`}`) } else if field.IsMessage() || p.IsGroup(field) { funcCall := getFuncCall(goTypName) if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(10)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() if gogoproto.IsNullable(field) { p.P(`this.`, fieldname, `[i] = `, funcCall) } else { p.P(p.varGen.Next(), `:= `, funcCall) p.P(`this.`, fieldname, `[i] = *`, p.varGen.Current()) } p.Out() p.P(`}`) } else { if gogoproto.IsNullable(field) { p.P(`this.`, fieldname, ` = `, funcCall) } else { p.P(p.varGen.Next(), `:= `, funcCall) p.P(`this.`, fieldname, ` = *`, p.varGen.Current()) } } } else { if field.IsEnum() { val := p.getEnumVal(field, goTyp) if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(10)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(`this.`, fieldname, `[i] = `, val) p.Out() p.P(`}`) } else if !gogoproto.IsNullable(field) || proto3 { p.P(`this.`, fieldname, ` = `, val) } else { p.P(p.varGen.Next(), ` := `, val) p.P(`this.`, fieldname, ` = &`, p.varGen.Current()) } } else if gogoproto.IsCustomType(field) { funcCall := getCustomFuncCall(goTypName) if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(10)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(p.varGen.Next(), `:= `, funcCall) p.P(`this.`, fieldname, `[i] = *`, p.varGen.Current()) p.Out() p.P(`}`) } else if gogoproto.IsNullable(field) { p.P(`this.`, fieldname, ` = `, funcCall) } else { p.P(p.varGen.Next(), `:= `, funcCall) p.P(`this.`, fieldname, ` = *`, p.varGen.Current()) } } else if field.IsBytes() { if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(100)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(p.varGen.Next(), ` := r.Intn(100)`) p.P(`this.`, fieldname, `[i] = make([]byte,`, p.varGen.Current(), `)`) p.P(`for j := 0; j < `, p.varGen.Current(), `; j++ {`) p.In() p.P(`this.`, fieldname, `[i][j] = byte(r.Intn(256))`) p.Out() p.P(`}`) p.Out() p.P(`}`) } else { p.P(p.varGen.Next(), ` := r.Intn(100)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(`this.`, fieldname, `[i] = byte(r.Intn(256))`) p.Out() p.P(`}`) } } else if field.IsString() { val := fmt.Sprintf("randString%v(r)", p.localName) if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(10)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(`this.`, fieldname, `[i] = `, val) p.Out() p.P(`}`) } else if !gogoproto.IsNullable(field) || proto3 { p.P(`this.`, fieldname, ` = `, val) } else { p.P(p.varGen.Next(), `:= `, val) p.P(`this.`, fieldname, ` = &`, p.varGen.Current()) } } else { typName := generator.GoTypeToName(goTyp) if field.IsRepeated() { p.P(p.varGen.Next(), ` := r.Intn(100)`) p.P(`this.`, fieldname, ` = make(`, goTyp, `, `, p.varGen.Current(), `)`) p.P(`for i := 0; i < `, p.varGen.Current(), `; i++ {`) p.In() p.P(`this.`, fieldname, `[i] = `, value(typName)) if negative(typName) { p.P(`if r.Intn(2) == 0 {`) p.In() p.P(`this.`, fieldname, `[i] *= -1`) p.Out() p.P(`}`) } p.Out() p.P(`}`) } else if !gogoproto.IsNullable(field) || proto3 { p.P(`this.`, fieldname, ` = `, value(typName)) if negative(typName) { p.P(`if r.Intn(2) == 0 {`) p.In() p.P(`this.`, fieldname, ` *= -1`) p.Out() p.P(`}`) } } else { p.P(p.varGen.Next(), ` := `, value(typName)) if negative(typName) { p.P(`if r.Intn(2) == 0 {`) p.In() p.P(p.varGen.Current(), ` *= -1`) p.Out() p.P(`}`) } p.P(`this.`, fieldname, ` = &`, p.varGen.Current()) } } } }
func BuildField(fileDescriptorSet *descriptor.FileDescriptorSet, msg *descriptor.DescriptorProto, f *descriptor.FieldDescriptorProto, help string, proto3 bool) string { tooltip := "" colon := ":" if len(help) > 0 { tooltip = ` <a href="#" data-toggle="tooltip" title="` + strings.Replace(help, "\n", " ", -1) + `"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span></a>` colon = "" } fieldname := f.GetName() if f.IsMessage() { typName := typ(fieldname, f.IsRepeated(), getMessage(f, fileDescriptorSet)) if !f.IsRepeated() { return `s += '<div class="children" type="` + typName + `">' + build` + typName + `(json["` + f.GetName() + `"]); s += '</div>'; s += setLink(json, "` + typName + `", "` + fieldname + `", "` + help + `"); ` } else { return `s += '<div class="children" type="` + typName + `">'; var ` + fieldname + ` = getList(json, "` + fieldname + `"); for (var i = 0; i < ` + fieldname + `.length; i++) { s += build` + typName + `(` + fieldname + `[i]); } s += '</div>'; s += '<a href="#" class="add-child btn btn-success btn-sm" role="button" type="` + typName + `">add ` + fieldname + `</a>` + tooltip + `'; s += '<div class="field form-group"></div>'; ` } } else { if !f.IsRepeated() { if isBool(f) { defaultBool := "\"nothing\"" if proto3 { defaultBool = "false" } if f.DefaultValue != nil { defaultBool = f.GetDefaultValue() } s := `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label>'; ` s += `s += '<div class="col-sm-10"><div class="btn-group" data-toggle="buttons">'; ` s += `s += '<label class="btn btn-primary ' + activeradio(` + defaultBool + `, false, json["` + fieldname + `"]) + '"><input type="radio" name="` + fieldname + `" value="false" ' + radioed(` + defaultBool + `, false, json["` + fieldname + `"]) + '/>No</label>'; ` s += `s += '<label class="btn btn-primary ' + activeradio(` + defaultBool + `, true, json["` + fieldname + `"]) + '"><input type="radio" name="` + fieldname + `" value="true" ' + radioed(` + defaultBool + `, true, json["` + fieldname + `"]) + '/>Yes</label>'; ` s += `s += '</div></div></div>'; ` return s } else if isEnum(f) { enum := getEnum(fileDescriptorSet, f) defaultEnum := "\"nothing\"" if proto3 { defaultEnum = "0" } if f.DefaultValue != nil { for _, v := range enum.GetValue() { if v.GetName() == f.GetDefaultValue() { defaultEnum = strconv.Itoa(int(v.GetNumber())) break } } } if len(enum.GetValue()) <= 4 { s := `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label>'; ` s += `s += '<div class="col-sm-10"><div class="btn-group" data-toggle="buttons">'; ` for _, v := range enum.GetValue() { num := strconv.Itoa(int(v.GetNumber())) s += `s += '<label class="btn btn-primary ' + activeradio(` + defaultEnum + `, ` + num + `, json["` + fieldname + `"]) + '"><input type="radio" name="` + fieldname + `" value="` + num + `" ' + radioed(` + defaultEnum + `, ` + num + `, json["` + fieldname + `"]) + '/> ` + v.GetName() + `</label>'; ` } s += `s += '</div></div></div>'; ` return s } else { s := `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label><div class="col-sm-10">'; s += '<select class="form-control" name="` + fieldname + `">'; ` for _, v := range enum.GetValue() { num := strconv.Itoa(int(v.GetNumber())) s += `s += '<option value="` + num + `" ' + selected(` + defaultEnum + `, ` + num + `, json["` + fieldname + `"]) + '>` + v.GetName() + `</option>'; ` } s += `s += '</select></div></div>'; ` return s } } else if isNumber(f) { def := "\"\"" if proto3 { def = "0" } if f.DefaultValue != nil { def = f.GetDefaultValue() } return `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label><div class="col-sm-10"><input class="form-control" name="` + f.GetName() + `" type="number" step="1" '+setValue(` + def + `, json["` + f.GetName() + `"])+'/></div></div>'; ` } else if isFloat(f) { def := "\"\"" if proto3 { def = "0" } if f.DefaultValue != nil { def = f.GetDefaultValue() } return `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label><div class="col-sm-10"><input class="form-control" name="` + f.GetName() + `" type="number" step="any" '+setValue(` + def + `, json["` + f.GetName() + `"])+'/></div></div>'; ` } else { def := "undefined" if proto3 { def = "\"\"" } if f.DefaultValue != nil { def = strconv.Quote(f.GetDefaultValue()) } return `s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + tooltip + colon + ` </label><div class="col-sm-10"><input class="form-control" name="` + f.GetName() + `" type="text" '+setStrValue(` + def + `, json["` + f.GetName() + `"])+'/></div></div>'; ` } } else { if isBool(f) { s := ` s += '<div class="fields" fieldname="` + fieldname + `">'; var ` + fieldname + ` = getList(json, "` + fieldname + `"); for (var i = 0; i < ` + fieldname + `.length; i++) { s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + `: </label><div class="col-sm-8"><input name="` + fieldname + `" type="checkbox" repeated="true" ' + checked(` + fieldname + `[i]) + '/></div><div class="col-sm-2"><a href="#" class="del-field btn btn-warning btn-sm" role="button">Remove</a></div></div>'; } s += '</div>'; s += '<a href="#" fieldname="` + fieldname + `" class="add-elem btn btn-info btn-sm" role="button" type="bool">add ` + fieldname + `</a>` + tooltip + `'; s += '<div class="field form-group"></div>'; ` return s } else if isNumber(f) || isEnum(f) { s := `s += '<div class="fields" fieldname="` + fieldname + `">'; var ` + fieldname + ` = getList(json, "` + fieldname + `"); for (var i = 0; i < ` + fieldname + `.length; i++) { s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + `: </label><div class="col-sm-8"><input class="form-control" name="` + fieldname + `" type="number" step="any" repeated="true" '+setRepValue(json["` + f.GetName() + `"][i])+'/></div><div class="col-sm-2"><a href="#" class="del-field btn btn-warning btn-sm" role="button">Remove</a></div></div>'; } s += '</div>'; s += '<a href="#" fieldname="` + fieldname + `" class="add-elem btn btn-info btn-sm" role="button" type="number">add ` + fieldname + `</a>` + tooltip + `'; s += '<div class="field form-group"></div>'; ` return s } else if isFloat(f) { s := `s += '<div class="fields" fieldname="` + fieldname + `">'; var ` + fieldname + ` = getList(json, "` + fieldname + `"); for (var i = 0; i < ` + fieldname + `.length; i++) { s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + `: </label><div class="col-sm-8"><input class="form-control" name="` + fieldname + `" type="number" step="1" repeated="true" '+setRepValue(json["` + f.GetName() + `"][i])+'/></div><div class="col-sm-2"><a href="#" class="del-field btn btn-warning btn-sm" role="button">Remove</a></div></div>'; } s += '</div>'; s += '<a href="#" fieldname="` + fieldname + `" class="add-elem btn btn-info btn-sm" role="button" type="float">add ` + fieldname + `</a>` + tooltip + `'; s += '<div class="field form-group"></div>'; ` return s } else { s := `s += '<div class="fields" fieldname="` + fieldname + `">'; var ` + fieldname + ` = getList(json, "` + fieldname + `"); for (var i = 0; i < ` + fieldname + `.length; i++) { s += '<div class="field form-group"><label class="col-sm-2 control-label">` + fieldname + `: </label><div class="col-sm-8"><input class="form-control" name="` + fieldname + `" type="text" repeated="true" '+setRepStrValue(json["` + f.GetName() + `"][i])+'/></div><div class="col-sm-2"><a href="#" class="del-field btn btn-warning btn-sm" role="button">Remove</a></div></div>'; } s += '</div>'; s += '<a href="#" fieldname="` + fieldname + `" class="add-elem btn btn-info btn-sm" role="button" type="text">add ` + fieldname + `</a>` + tooltip + `'; s += '<div class="field form-group"></div>'; ` return s } } } panic("unreachable") }
func (p *size) generateField(proto3 bool, file *generator.FileDescriptor, message *generator.Descriptor, field *descriptor.FieldDescriptorProto, sizeName string) { fieldname := p.GetOneOfFieldName(message, field) nullable := gogoproto.IsNullable(field) repeated := field.IsRepeated() doNilCheck := gogoproto.NeedsNilCheck(proto3, field) if repeated { p.P(`if len(m.`, fieldname, `) > 0 {`) p.In() } else if doNilCheck { p.P(`if m.`, fieldname, ` != nil {`) p.In() } packed := field.IsPacked() || (proto3 && field.IsPacked3()) _, wire := p.GoType(message, field) wireType := wireToType(wire) fieldNumber := field.GetNumber() if packed { wireType = proto.WireBytes } key := keySize(fieldNumber, wireType) switch *field.Type { case descriptor.FieldDescriptorProto_TYPE_DOUBLE, descriptor.FieldDescriptorProto_TYPE_FIXED64, descriptor.FieldDescriptorProto_TYPE_SFIXED64: if packed { p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(len(m.`, fieldname, `)*8))`, `+len(m.`, fieldname, `)*8`) } else if repeated { p.P(`n+=`, strconv.Itoa(key+8), `*len(m.`, fieldname, `)`) } else if proto3 { p.P(`if m.`, fieldname, ` != 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key+8)) p.Out() p.P(`}`) } else if nullable { p.P(`n+=`, strconv.Itoa(key+8)) } else { p.P(`n+=`, strconv.Itoa(key+8)) } case descriptor.FieldDescriptorProto_TYPE_FLOAT, descriptor.FieldDescriptorProto_TYPE_FIXED32, descriptor.FieldDescriptorProto_TYPE_SFIXED32: if packed { p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(len(m.`, fieldname, `)*4))`, `+len(m.`, fieldname, `)*4`) } else if repeated { p.P(`n+=`, strconv.Itoa(key+4), `*len(m.`, fieldname, `)`) } else if proto3 { p.P(`if m.`, fieldname, ` != 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key+4)) p.Out() p.P(`}`) } else if nullable { p.P(`n+=`, strconv.Itoa(key+4)) } else { p.P(`n+=`, strconv.Itoa(key+4)) } case descriptor.FieldDescriptorProto_TYPE_INT64, descriptor.FieldDescriptorProto_TYPE_UINT64, descriptor.FieldDescriptorProto_TYPE_UINT32, descriptor.FieldDescriptorProto_TYPE_ENUM, descriptor.FieldDescriptorProto_TYPE_INT32: if packed { p.P(`l = 0`) p.P(`for _, e := range m.`, fieldname, ` {`) p.In() p.P(`l+=sov`, p.localName, `(uint64(e))`) p.Out() p.P(`}`) p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(l))+l`) } else if repeated { p.P(`for _, e := range m.`, fieldname, ` {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(e))`) p.Out() p.P(`}`) } else if proto3 { p.P(`if m.`, fieldname, ` != 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(m.`, fieldname, `))`) p.Out() p.P(`}`) } else if nullable { p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(*m.`, fieldname, `))`) } else { p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(m.`, fieldname, `))`) } case descriptor.FieldDescriptorProto_TYPE_BOOL: if packed { p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(len(m.`, fieldname, `)))`, `+len(m.`, fieldname, `)*1`) } else if repeated { p.P(`n+=`, strconv.Itoa(key+1), `*len(m.`, fieldname, `)`) } else if proto3 { p.P(`if m.`, fieldname, ` {`) p.In() p.P(`n+=`, strconv.Itoa(key+1)) p.Out() p.P(`}`) } else if nullable { p.P(`n+=`, strconv.Itoa(key+1)) } else { p.P(`n+=`, strconv.Itoa(key+1)) } case descriptor.FieldDescriptorProto_TYPE_STRING: if repeated { p.P(`for _, s := range m.`, fieldname, ` { `) p.In() p.P(`l = len(s)`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else if proto3 { p.P(`l=len(m.`, fieldname, `)`) p.P(`if l > 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else if nullable { p.P(`l=len(*m.`, fieldname, `)`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) } else { p.P(`l=len(m.`, fieldname, `)`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) } case descriptor.FieldDescriptorProto_TYPE_GROUP: panic(fmt.Errorf("size does not support group %v", fieldname)) case descriptor.FieldDescriptorProto_TYPE_MESSAGE: if p.IsMap(field) { m := p.GoMapType(nil, field) _, keywire := p.GoType(nil, m.KeyAliasField) valuegoTyp, _ := p.GoType(nil, m.ValueField) valuegoAliasTyp, valuewire := p.GoType(nil, m.ValueAliasField) _, fieldwire := p.GoType(nil, field) nullable, valuegoTyp, valuegoAliasTyp = generator.GoMapValueTypes(field, m.ValueField, valuegoTyp, valuegoAliasTyp) fieldKeySize := keySize(field.GetNumber(), wireToType(fieldwire)) keyKeySize := keySize(1, wireToType(keywire)) valueKeySize := keySize(2, wireToType(valuewire)) p.P(`for k, v := range m.`, fieldname, ` { `) p.In() p.P(`_ = k`) p.P(`_ = v`) sum := []string{strconv.Itoa(keyKeySize)} switch m.KeyField.GetType() { case descriptor.FieldDescriptorProto_TYPE_DOUBLE, descriptor.FieldDescriptorProto_TYPE_FIXED64, descriptor.FieldDescriptorProto_TYPE_SFIXED64: sum = append(sum, `8`) case descriptor.FieldDescriptorProto_TYPE_FLOAT, descriptor.FieldDescriptorProto_TYPE_FIXED32, descriptor.FieldDescriptorProto_TYPE_SFIXED32: sum = append(sum, `4`) case descriptor.FieldDescriptorProto_TYPE_INT64, descriptor.FieldDescriptorProto_TYPE_UINT64, descriptor.FieldDescriptorProto_TYPE_UINT32, descriptor.FieldDescriptorProto_TYPE_ENUM, descriptor.FieldDescriptorProto_TYPE_INT32: sum = append(sum, `sov`+p.localName+`(uint64(k))`) case descriptor.FieldDescriptorProto_TYPE_BOOL: sum = append(sum, `1`) case descriptor.FieldDescriptorProto_TYPE_STRING, descriptor.FieldDescriptorProto_TYPE_BYTES: sum = append(sum, `len(k)+sov`+p.localName+`(uint64(len(k)))`) case descriptor.FieldDescriptorProto_TYPE_SINT32, descriptor.FieldDescriptorProto_TYPE_SINT64: sum = append(sum, `soz`+p.localName+`(uint64(k))`) } switch m.ValueField.GetType() { case descriptor.FieldDescriptorProto_TYPE_DOUBLE, descriptor.FieldDescriptorProto_TYPE_FIXED64, descriptor.FieldDescriptorProto_TYPE_SFIXED64: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, strconv.Itoa(8)) case descriptor.FieldDescriptorProto_TYPE_FLOAT, descriptor.FieldDescriptorProto_TYPE_FIXED32, descriptor.FieldDescriptorProto_TYPE_SFIXED32: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, strconv.Itoa(4)) case descriptor.FieldDescriptorProto_TYPE_INT64, descriptor.FieldDescriptorProto_TYPE_UINT64, descriptor.FieldDescriptorProto_TYPE_UINT32, descriptor.FieldDescriptorProto_TYPE_ENUM, descriptor.FieldDescriptorProto_TYPE_INT32: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, `sov`+p.localName+`(uint64(v))`) case descriptor.FieldDescriptorProto_TYPE_BOOL: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, `1`) case descriptor.FieldDescriptorProto_TYPE_STRING: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, `len(v)+sov`+p.localName+`(uint64(len(v)))`) case descriptor.FieldDescriptorProto_TYPE_BYTES: if gogoproto.IsCustomType(field) { p.P(`l = 0`) if nullable { p.P(`if v != nil {`) p.In() } p.P(`l = v.`, sizeName, `()`) p.P(`l += `, strconv.Itoa(valueKeySize), ` + sov`+p.localName+`(uint64(l))`) if nullable { p.Out() p.P(`}`) } sum = append(sum, `l`) } else { p.P(`l = 0`) if proto3 { p.P(`if len(v) > 0 {`) } else { p.P(`if v != nil {`) } p.In() p.P(`l = `, strconv.Itoa(valueKeySize), ` + len(v)+sov`+p.localName+`(uint64(len(v)))`) p.Out() p.P(`}`) sum = append(sum, `l`) } case descriptor.FieldDescriptorProto_TYPE_SINT32, descriptor.FieldDescriptorProto_TYPE_SINT64: sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, `soz`+p.localName+`(uint64(v))`) case descriptor.FieldDescriptorProto_TYPE_MESSAGE: stdSizeCall, stdOk := p.std(field, "v") if nullable { p.P(`l = 0`) p.P(`if v != nil {`) p.In() if stdOk { p.P(`l = `, stdSizeCall) } else if valuegoTyp != valuegoAliasTyp { p.P(`l = ((`, valuegoTyp, `)(v)).`, sizeName, `()`) } else { p.P(`l = v.`, sizeName, `()`) } p.P(`l += `, strconv.Itoa(valueKeySize), ` + sov`+p.localName+`(uint64(l))`) p.Out() p.P(`}`) sum = append(sum, `l`) } else { if stdOk { p.P(`l = `, stdSizeCall) } else if valuegoTyp != valuegoAliasTyp { p.P(`l = ((*`, valuegoTyp, `)(&v)).`, sizeName, `()`) } else { p.P(`l = v.`, sizeName, `()`) } sum = append(sum, strconv.Itoa(valueKeySize)) sum = append(sum, `l+sov`+p.localName+`(uint64(l))`) } } p.P(`mapEntrySize := `, strings.Join(sum, "+")) p.P(`n+=mapEntrySize+`, fieldKeySize, `+sov`, p.localName, `(uint64(mapEntrySize))`) p.Out() p.P(`}`) } else if repeated { p.P(`for _, e := range m.`, fieldname, ` { `) p.In() stdSizeCall, stdOk := p.std(field, "e") if stdOk { p.P(`l=`, stdSizeCall) } else { p.P(`l=e.`, sizeName, `()`) } p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else { stdSizeCall, stdOk := p.std(field, "m."+fieldname) if stdOk { p.P(`l=`, stdSizeCall) } else { p.P(`l=m.`, fieldname, `.`, sizeName, `()`) } p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) } case descriptor.FieldDescriptorProto_TYPE_BYTES: if !gogoproto.IsCustomType(field) { if repeated { p.P(`for _, b := range m.`, fieldname, ` { `) p.In() p.P(`l = len(b)`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else if proto3 { p.P(`l=len(m.`, fieldname, `)`) p.P(`if l > 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else { p.P(`l=len(m.`, fieldname, `)`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) } } else { if repeated { p.P(`for _, e := range m.`, fieldname, ` { `) p.In() p.P(`l=e.`, sizeName, `()`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) p.Out() p.P(`}`) } else { p.P(`l=m.`, fieldname, `.`, sizeName, `()`) p.P(`n+=`, strconv.Itoa(key), `+l+sov`, p.localName, `(uint64(l))`) } } case descriptor.FieldDescriptorProto_TYPE_SINT32, descriptor.FieldDescriptorProto_TYPE_SINT64: if packed { p.P(`l = 0`) p.P(`for _, e := range m.`, fieldname, ` {`) p.In() p.P(`l+=soz`, p.localName, `(uint64(e))`) p.Out() p.P(`}`) p.P(`n+=`, strconv.Itoa(key), `+sov`, p.localName, `(uint64(l))+l`) } else if repeated { p.P(`for _, e := range m.`, fieldname, ` {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+soz`, p.localName, `(uint64(e))`) p.Out() p.P(`}`) } else if proto3 { p.P(`if m.`, fieldname, ` != 0 {`) p.In() p.P(`n+=`, strconv.Itoa(key), `+soz`, p.localName, `(uint64(m.`, fieldname, `))`) p.Out() p.P(`}`) } else if nullable { p.P(`n+=`, strconv.Itoa(key), `+soz`, p.localName, `(uint64(*m.`, fieldname, `))`) } else { p.P(`n+=`, strconv.Itoa(key), `+soz`, p.localName, `(uint64(m.`, fieldname, `))`) } default: panic("not implemented") } if repeated || doNilCheck { p.Out() p.P(`}`) } }
func (p *unmarshal) mapField(varName string, field *descriptor.FieldDescriptorProto) { switch field.GetType() { case descriptor.FieldDescriptorProto_TYPE_DOUBLE: p.P(`var `, varName, `temp uint64`) p.decodeFixed64(varName+"temp", "uint64") p.P(varName, ` := `, p.mathPkg.Use(), `.Float64frombits(`, varName, `temp)`) case descriptor.FieldDescriptorProto_TYPE_FLOAT: p.P(`var `, varName, `temp uint32`) p.decodeFixed32(varName+"temp", "uint32") p.P(varName, ` := `, p.mathPkg.Use(), `.Float32frombits(`, varName, `temp)`) case descriptor.FieldDescriptorProto_TYPE_INT64: p.P(`var `, varName, ` int64`) p.decodeVarint(varName, "int64") case descriptor.FieldDescriptorProto_TYPE_UINT64: p.P(`var `, varName, ` uint64`) p.decodeVarint(varName, "uint64") case descriptor.FieldDescriptorProto_TYPE_INT32: p.P(`var `, varName, ` int32`) p.decodeVarint(varName, "int32") case descriptor.FieldDescriptorProto_TYPE_FIXED64: p.P(`var `, varName, ` uint64`) p.decodeFixed64(varName, "uint64") case descriptor.FieldDescriptorProto_TYPE_FIXED32: p.P(`var `, varName, ` uint32`) p.decodeFixed32(varName, "uint32") case descriptor.FieldDescriptorProto_TYPE_BOOL: p.P(`var `, varName, `temp int`) p.decodeVarint(varName+"temp", "int") p.P(varName, ` := bool(`, varName, `temp != 0)`) case descriptor.FieldDescriptorProto_TYPE_STRING: p.P(`var stringLen`, varName, ` uint64`) p.decodeVarint("stringLen"+varName, "uint64") p.P(`postStringIndex`, varName, ` := iNdEx + int(stringLen`, varName, `)`) p.P(`if postStringIndex`, varName, ` > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) p.P(varName, ` := string(data[iNdEx:postStringIndex`, varName, `])`) p.P(`iNdEx = postStringIndex`, varName) case descriptor.FieldDescriptorProto_TYPE_MESSAGE: p.P(`var mapmsglen int`) p.decodeVarint("mapmsglen", "int") p.P(`postmsgIndex := iNdEx + mapmsglen`) p.P(`if postmsgIndex > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) desc := p.ObjectNamed(field.GetTypeName()) msgname := p.TypeName(desc) p.P(varName, ` := &`, msgname, `{}`) p.P(`if err := `, varName, `.Unmarshal(data[iNdEx:postmsgIndex]); err != nil {`) p.In() p.P(`return err`) p.Out() p.P(`}`) p.P(`iNdEx = postmsgIndex`) case descriptor.FieldDescriptorProto_TYPE_BYTES: p.P(`var mapbyteLen uint64`) p.decodeVarint("mapbyteLen", "uint64") p.P(`postbytesIndex := iNdEx + int(mapbyteLen)`) p.P(`if postbytesIndex > l {`) p.In() p.P(`return `, p.ioPkg.Use(), `.ErrUnexpectedEOF`) p.Out() p.P(`}`) p.P(varName, ` := make([]byte, mapbyteLen)`) p.P(`copy(`, varName, `, data[iNdEx:postbytesIndex])`) p.P(`iNdEx = postbytesIndex`) case descriptor.FieldDescriptorProto_TYPE_UINT32: p.P(`var `, varName, ` uint32`) p.decodeVarint(varName, "uint32") case descriptor.FieldDescriptorProto_TYPE_ENUM: typName := p.TypeName(p.ObjectNamed(field.GetTypeName())) p.P(`var `, varName, ` `, typName) p.decodeVarint(varName, typName) case descriptor.FieldDescriptorProto_TYPE_SFIXED32: p.P(`var `, varName, ` int32`) p.decodeFixed32(varName, "int32") case descriptor.FieldDescriptorProto_TYPE_SFIXED64: p.P(`var `, varName, ` int64`) p.decodeFixed64(varName, "int64") case descriptor.FieldDescriptorProto_TYPE_SINT32: p.P(`var `, varName, `temp int32`) p.decodeVarint(varName+"temp", "int32") p.P(varName, `temp = int32((uint32(`, varName, `temp) >> 1) ^ uint32(((`, varName, `temp&1)<<31)>>31))`) p.P(varName, ` := int32(`, varName, `temp)`) case descriptor.FieldDescriptorProto_TYPE_SINT64: p.P(`var `, varName, `temp uint64`) p.decodeVarint(varName+"temp", "uint64") p.P(varName, `temp = (`, varName, `temp >> 1) ^ uint64((int64(`, varName, `temp&1)<<63)>>63)`) p.P(varName, ` := int64(`, varName, `temp)`) } }
func (g *Generator) IsGroup(field *descriptor.FieldDescriptorProto) bool { if d, ok := g.typeNameToObject[field.GetTypeName()].(*Descriptor); ok { return d.IsGroup() } return false }