diff --git a/copyable.go b/copyable.go index df98baf6ada81073d75fee01ac6884d669f90c23..b579e6d008f9d6875ca7065fb338832ef3c7be63 100644 --- a/copyable.go +++ b/copyable.go @@ -10,7 +10,12 @@ import ( // // Copy implements the xflags.Copyable interface. func (s *Settings[C]) Copy(m map[string]any) { - c := s.Config() + if s == nil { + panic("struct is not initialized") + } + + s.Lock() + defer s.Unlock() errorCount := len(s.errors) defer func() { @@ -19,6 +24,12 @@ func (s *Settings[C]) Copy(m map[string]any) { } }() + copyOf := func(s C) C { + return s + } + + c := copyOf(s.config) + for k, v := range m { err := pathfinder.SetValue(&c, k, v) if err != nil { @@ -26,5 +37,6 @@ func (s *Settings[C]) Copy(m map[string]any) { } } - s.setConfigInternal(c, true) + s.setConfigInternal(c, false) + } diff --git a/copyable_test.go b/copyable_test.go index b98407dd7c525e1ef4a8ae79c748a5bd612a6bec..b65eebeb35f8af14dd227171d25b4b04c36cfb38 100644 --- a/copyable_test.go +++ b/copyable_test.go @@ -3,22 +3,31 @@ package configuration -//type testExecutionStruct struct { -//} -// -//type testConfigStruct struct { -//} -// -//func (s *testConfigStruct) Copy(m map[string]any) { -//} -// -//func TestXFlagsCopyable(t *testing.T) { -// config := New(testConfigStruct{}) -// flags := xflags.Execute(testExecutionStruct{}, config) -// flags.Parse([]string{"-a", "command1", "-d"}) -//} -// -//func TestXFlagsCopyable2(t *testing.T) { -// flags := xflags.Execute(testExecutionStruct{}) -// flags.Parse([]string{"-a", "command1", "-d"}) -//} +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestCopyable(t *testing.T) { + config := struct { + Host string + Port int + }{ + Host: "localhost", + Port: 8080, + } + + c := New(config) + + assert.Equal(t, c.Config().Host, "localhost") + assert.Equal(t, c.Config().Port, 8080) + + m := map[string]any{ + "Host": "1.2.3.4", + } + + c.Copy(m) + + assert.Equal(t, c.Config().Host, "1.2.3.4") + +} diff --git a/go.mod b/go.mod index 3f5bcdc60e69bf186475794d14005c502dd7f4df..f02d0d80c43c06b1a9b5ea63be5345a99c5f414d 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/stretchr/testify v1.8.0 gitlab.schukai.com/oss/libraries/go/application/xflags v1.9.0 gitlab.schukai.com/oss/libraries/go/network/http-negotiation v1.3.0 - gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.0 - golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 + gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.1 + golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e gopkg.in/yaml.v3 v3.0.1 ) @@ -22,8 +22,8 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect - golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect - golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect + golang.org/x/net v0.1.0 // indirect + golang.org/x/sys v0.1.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect ) diff --git a/go.sum b/go.sum index a3bd3737eb31873f5556420b686d3acbc0d0ed1e..c2d8f12f0264b0015e4ff4e73a35113601a8cc88 100644 --- a/go.sum +++ b/go.sum @@ -35,16 +35,24 @@ gitlab.schukai.com/oss/libraries/go/network/http-negotiation v1.3.0 h1:SZG0BW5ll gitlab.schukai.com/oss/libraries/go/network/http-negotiation v1.3.0/go.mod h1:RS2rKf5O+rmSBshHLOgjG7dxg5N2MhNYokZOBcuXdX8= gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.0 h1:mSxk2q/npskmHMmw1oF4moccjGav5dL6qmff2njUV7A= gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.0/go.mod h1:UvdD4NAf3gLKYafabJD7e9ZCOetzM9JZ9y4GkZukPVU= +gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.1 h1:oyElaqEiyr2XgaE1CYwD8LoeHsuR/vQD/p6k3jYbJFs= +gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.3.1/go.mod h1:UvdD4NAf3gLKYafabJD7e9ZCOetzM9JZ9y4GkZukPVU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 h1:sBdrWpxhGDdTAYNqbgBLAR+ULAPPhfgncLr1X0lyWtg= golang.org/x/exp v0.0.0-20221012211006-4de253d81b95/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e h1:SkwG94eNiiYJhbeDE018Grw09HIN/KB9NlRmZsrzfWs= +golang.org/x/exp v0.0.0-20221023144134-a1e5550cf13e/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/merge.go b/merge.go new file mode 100644 index 0000000000000000000000000000000000000000..bb55939933e29c1543651b65f0209b859aed4fff --- /dev/null +++ b/merge.go @@ -0,0 +1,19 @@ +package configuration + +import "github.com/imdario/mergo" + +func (s *Settings[C]) Merge(change C) *Settings[C] { + + if s == nil { + panic("struct is not initialized") + } + + s.Lock() + defer s.Unlock() + + if err := mergo.Merge(&s.config, change); err != nil { + s.errors = append(s.errors, err) + } + + return s +}