v2fly/main/formats/formats.go

57 lines
1.3 KiB
Go

package formats
import (
"bytes"
core "github.com/v2fly/v2ray-core/v4"
"github.com/v2fly/v2ray-core/v4/common"
"github.com/v2fly/v2ray-core/v4/infra/conf/merge"
"github.com/v2fly/v2ray-core/v4/infra/conf/mergers"
"github.com/v2fly/v2ray-core/v4/infra/conf/serial"
)
func init() {
for _, formatName := range mergers.GetAllNames() {
loader, err := makeMergeLoader(formatName)
if err != nil {
panic(err)
}
if formatName == core.FormatAuto {
loader.Extension = nil
}
common.Must(core.RegisterConfigLoader(loader))
}
}
func makeMergeLoader(formatName string) (*core.ConfigFormat, error) {
extenstoins, err := mergers.GetExtensions(formatName)
if err != nil {
return nil, err
}
return &core.ConfigFormat{
Name: []string{formatName},
Extension: extenstoins,
Loader: makeLoaderFunc(formatName),
}, nil
}
func makeLoaderFunc(formatName string) core.ConfigLoader {
return func(input interface{}) (*core.Config, error) {
m := make(map[string]interface{})
err := mergers.MergeAs(formatName, input, m)
if err != nil {
return nil, err
}
data, err := merge.FromMap(m)
if err != nil {
return nil, err
}
r := bytes.NewReader(data)
cf, err := serial.DecodeJSONConfig(r)
if err != nil {
return nil, err
}
return cf.Build()
}
}