Exemplo n.º 1
0
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(``)
}