func (g *validation) generateValidator(file *generator.FileDescriptor, msg *generator.Descriptor) { if msg.GetOptions().GetMapEntry() { return } g.P(`func (msg *`, g.gen.TypeName(msg), `) Validate() error {`) var patterns = map[string]string{} for idx, field := range msg.Field { if field.OneofIndex != nil { continue } fieldName := "msg." + g.gen.GetFieldName(msg, field) g.generateTests(msg, field, fieldName, idx, patterns) } for oneofIdx, oneof := range msg.OneofDecl { g.P(`switch c := msg.Get`, generator.CamelCase(oneof.GetName()), `().(type) {`) for idx, field := range msg.Field { if field.OneofIndex == nil { continue } if *field.OneofIndex != int32(oneofIdx) { continue } g.P(`case *`, g.gen.OneOfTypeName(msg, field), `:`) fieldName := "c." + g.gen.GetOneOfFieldName(msg, field) g.generateTests(msg, field, fieldName, idx, patterns) } g.P(`}`) } g.P(`return nil`) g.P(`}`) g.P(``) for name, pattern := range patterns { g.P(`var `, name, ` = `, g.regexpPkg.Use(), `.MustCompile(`, strconv.Quote(pattern), `)`) } g.P(``) }