mirror of
https://github.com/zeromicro/go-zero.git
synced 2025-02-03 00:38:40 +08:00
fix: inherit issue when parent after inherits (#2586)
* fix: inherit issue when parent after inherits * chore: add more tests
This commit is contained in:
parent
4b071f4c33
commit
e3e08a7396
@ -2991,6 +2991,97 @@ func TestUnmarshaler_InheritFromGrandparent(t *testing.T) {
|
|||||||
assert.Equal(t, "localhost:8080", s.Middle.Value.Discovery)
|
assert.Equal(t, "localhost:8080", s.Middle.Value.Discovery)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshaler_InheritSequence(t *testing.T) {
|
||||||
|
var testConf = []byte(`
|
||||||
|
Nacos:
|
||||||
|
NamespaceId: "123"
|
||||||
|
RpcConf:
|
||||||
|
Nacos:
|
||||||
|
NamespaceId: "456"
|
||||||
|
Name: hello
|
||||||
|
`)
|
||||||
|
|
||||||
|
type (
|
||||||
|
NacosConf struct {
|
||||||
|
NamespaceId string
|
||||||
|
}
|
||||||
|
|
||||||
|
RpcConf struct {
|
||||||
|
Nacos NacosConf `json:",inherit"`
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
Config1 struct {
|
||||||
|
RpcConf RpcConf
|
||||||
|
Nacos NacosConf
|
||||||
|
}
|
||||||
|
|
||||||
|
Config2 struct {
|
||||||
|
RpcConf RpcConf
|
||||||
|
Nacos NacosConf
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
var c1 Config1
|
||||||
|
assert.NoError(t, UnmarshalYamlBytes(testConf, &c1))
|
||||||
|
assert.Equal(t, "123", c1.Nacos.NamespaceId)
|
||||||
|
assert.Equal(t, "456", c1.RpcConf.Nacos.NamespaceId)
|
||||||
|
|
||||||
|
var c2 Config2
|
||||||
|
assert.NoError(t, UnmarshalYamlBytes(testConf, &c2))
|
||||||
|
assert.Equal(t, "123", c1.Nacos.NamespaceId)
|
||||||
|
assert.Equal(t, "456", c1.RpcConf.Nacos.NamespaceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshaler_InheritNested(t *testing.T) {
|
||||||
|
var testConf = []byte(`
|
||||||
|
Nacos:
|
||||||
|
Value1: "123"
|
||||||
|
Server:
|
||||||
|
Nacos:
|
||||||
|
Value2: "456"
|
||||||
|
Rpc:
|
||||||
|
Nacos:
|
||||||
|
Value3: "789"
|
||||||
|
Name: hello
|
||||||
|
`)
|
||||||
|
|
||||||
|
type (
|
||||||
|
NacosConf struct {
|
||||||
|
Value1 string `json:",optional"`
|
||||||
|
Value2 string `json:",optional"`
|
||||||
|
Value3 string `json:",optional"`
|
||||||
|
}
|
||||||
|
|
||||||
|
RpcConf struct {
|
||||||
|
Nacos NacosConf `json:",inherit"`
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerConf struct {
|
||||||
|
Nacos NacosConf `json:",inherit"`
|
||||||
|
Rpc RpcConf
|
||||||
|
}
|
||||||
|
|
||||||
|
Config struct {
|
||||||
|
Server ServerConf
|
||||||
|
Nacos NacosConf
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
var c Config
|
||||||
|
assert.NoError(t, UnmarshalYamlBytes(testConf, &c))
|
||||||
|
assert.Equal(t, "123", c.Nacos.Value1)
|
||||||
|
assert.Empty(t, c.Nacos.Value2)
|
||||||
|
assert.Empty(t, c.Nacos.Value3)
|
||||||
|
assert.Equal(t, "123", c.Server.Nacos.Value1)
|
||||||
|
assert.Equal(t, "456", c.Server.Nacos.Value2)
|
||||||
|
assert.Empty(t, c.Nacos.Value3)
|
||||||
|
assert.Equal(t, "123", c.Server.Rpc.Nacos.Value1)
|
||||||
|
assert.Equal(t, "456", c.Server.Rpc.Nacos.Value2)
|
||||||
|
assert.Equal(t, "789", c.Server.Rpc.Nacos.Value3)
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnmarshalValuer(t *testing.T) {
|
func TestUnmarshalValuer(t *testing.T) {
|
||||||
unmarshaler := NewUnmarshaler(jsonTagKey)
|
unmarshaler := NewUnmarshaler(jsonTagKey)
|
||||||
var foo string
|
var foo string
|
||||||
|
@ -70,21 +70,33 @@ func (rv recursiveValuer) Value(key string) (interface{}, bool) {
|
|||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
if vm, ok := val.(map[string]interface{}); ok {
|
vm, ok := val.(map[string]interface{})
|
||||||
if parent := rv.Parent(); parent != nil {
|
if !ok {
|
||||||
pv, pok := parent.Value(key)
|
return val, true
|
||||||
if pok {
|
}
|
||||||
if pm, ok := pv.(map[string]interface{}); ok {
|
|
||||||
for k, v := range vm {
|
parent := rv.Parent()
|
||||||
pm[k] = v
|
if parent == nil {
|
||||||
}
|
return val, true
|
||||||
return pm, true
|
}
|
||||||
}
|
|
||||||
}
|
pv, ok := parent.Value(key)
|
||||||
|
if !ok {
|
||||||
|
return val, true
|
||||||
|
}
|
||||||
|
|
||||||
|
pm, ok := pv.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return val, true
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range pm {
|
||||||
|
if _, ok := vm[k]; !ok {
|
||||||
|
vm[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return val, true
|
return vm, true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parent get the parent valuer from rv.
|
// Parent get the parent valuer from rv.
|
||||||
|
Loading…
Reference in New Issue
Block a user