From f464610400c6c604648233b22c1e43430f0464ef Mon Sep 17 00:00:00 2001 From: almas-x Date: Mon, 24 Nov 2025 16:43:15 +0800 Subject: [PATCH] fix: [#817] make validator.Bind populate anonymous embedded struct fields in ValidateRequest --- validation/validator.go | 1 + validation/validator_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/validation/validator.go b/validation/validator.go index 1ffdff038..060266c9f 100644 --- a/validation/validator.go +++ b/validation/validator.go @@ -93,6 +93,7 @@ func (v *Validator) Bind(ptr any) error { TagName: "form", Result: &ptr, DecodeHook: v.castValue(), + Squash: true, }) if err != nil { return err diff --git a/validation/validator_test.go b/validation/validator_test.go index 2feaf99aa..2c920b312 100644 --- a/validation/validator_test.go +++ b/validation/validator_test.go @@ -23,6 +23,9 @@ import ( ) func TestBind_Rule(t *testing.T) { + type Embed struct { + C string `form:"c" json:"c"` + } type Data struct { A string `form:"a" json:"a"` B int `form:"b" json:"b"` @@ -44,6 +47,7 @@ func TestBind_Rule(t *testing.T) { TimestampMicro *carbon.TimestampMicro `form:"timestamp_micro" json:"timestamp_micro"` TimestampNano *carbon.TimestampNano `form:"timestamp_nano" json:"timestamp_nano"` Time *time.Time `form:"time" json:"time"` + Embed } tests := []struct { @@ -636,6 +640,14 @@ func TestBind_Rule(t *testing.T) { assert.Equal(t, file.Filename, data.Files[1].Filename) }, }, + { + name: "data has embed struct field", + data: validate.FromMap(map[string]any{"c": "cc"}), + rules: map[string]string{"c": "required"}, + assert: func(data Data) { + assert.Equal(t, "cc", data.C) + }, + }, } validation := NewValidation()