v2fly/infra/conf/mergers/mergers.go

70 lines
1.5 KiB
Go

package mergers
//go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
import (
"strings"
core "github.com/v2fly/v2ray-core/v4"
"github.com/v2fly/v2ray-core/v4/common"
"github.com/v2fly/v2ray-core/v4/infra/conf/json"
)
func init() {
common.Must(RegisterMerger(makeMerger(
core.FormatJSON,
[]string{".json", ".jsonc"},
nil,
)))
common.Must(RegisterMerger(makeMerger(
core.FormatTOML,
[]string{".toml"},
json.FromTOML,
)))
common.Must(RegisterMerger(makeMerger(
core.FormatYAML,
[]string{".yml", ".yaml"},
json.FromYAML,
)))
common.Must(RegisterMerger(
&Merger{
Name: core.FormatAuto,
Extensions: nil,
Merge: Merge,
}),
)
}
// Merger is a configurable format merger for V2Ray config files.
type Merger struct {
Name string
Extensions []string
Merge MergeFunc
}
// MergeFunc is a utility to merge V2Ray config from external source into a map and returns it.
type MergeFunc func(input interface{}, m map[string]interface{}) error
var (
mergersByName = make(map[string]*Merger)
mergersByExt = make(map[string]*Merger)
)
// RegisterMerger add a new Merger.
func RegisterMerger(format *Merger) error {
if _, found := mergersByName[format.Name]; found {
return newError(format.Name, " already registered.")
}
mergersByName[format.Name] = format
for _, ext := range format.Extensions {
lext := strings.ToLower(ext)
if f, found := mergersByExt[lext]; found {
return newError(ext, " already registered to ", f.Name)
}
mergersByExt[lext] = format
}
return nil
}