|
@@ -17,6 +17,7 @@ import (
|
|
|
"github.com/sagernet/sing-box/log"
|
|
|
"github.com/sagernet/sing-box/option"
|
|
|
E "github.com/sagernet/sing/common/exceptions"
|
|
|
+ "github.com/sagernet/sing/common/json"
|
|
|
"github.com/sagernet/sing/common/json/badjson"
|
|
|
|
|
|
"github.com/spf13/cobra"
|
|
@@ -56,8 +57,7 @@ func readConfigAt(path string) (*OptionsEntry, error) {
|
|
|
if err != nil {
|
|
|
return nil, E.Cause(err, "read config at ", path)
|
|
|
}
|
|
|
- var options option.Options
|
|
|
- err = options.UnmarshalJSON(configContent)
|
|
|
+ options, err := json.UnmarshalExtended[option.Options](configContent)
|
|
|
if err != nil {
|
|
|
return nil, E.Cause(err, "decode config at ", path)
|
|
|
}
|
|
@@ -107,13 +107,18 @@ func readConfigAndMerge() (option.Options, error) {
|
|
|
if len(optionsList) == 1 {
|
|
|
return optionsList[0].options, nil
|
|
|
}
|
|
|
- var mergedOptions option.Options
|
|
|
+ var mergedMessage json.RawMessage
|
|
|
for _, options := range optionsList {
|
|
|
- mergedOptions, err = badjson.Merge(options.options, mergedOptions)
|
|
|
+ mergedMessage, err = badjson.MergeJSON(options.options.RawMessage, mergedMessage)
|
|
|
if err != nil {
|
|
|
return option.Options{}, E.Cause(err, "merge config at ", options.path)
|
|
|
}
|
|
|
}
|
|
|
+ var mergedOptions option.Options
|
|
|
+ err = mergedOptions.UnmarshalJSON(mergedMessage)
|
|
|
+ if err != nil {
|
|
|
+ return option.Options{}, E.Cause(err, "unmarshal merged config")
|
|
|
+ }
|
|
|
return mergedOptions, nil
|
|
|
}
|
|
|
|