mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-11-10 17:27:18 -05:00
@@ -18,95 +18,46 @@ package merge
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"github.com/v2fly/v2ray-core/v4/common/cmdarg"
|
||||
"github.com/v2fly/v2ray-core/v4/infra/conf/serial"
|
||||
)
|
||||
|
||||
// FilesToJSON merges multiple jsons files into one json, accepts remote url, or local file path
|
||||
func FilesToJSON(args []string) ([]byte, error) {
|
||||
m, err := FilesToMap(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return json.Marshal(m)
|
||||
}
|
||||
|
||||
// BytesToJSON merges multiple json contents into one json.
|
||||
func BytesToJSON(args [][]byte) ([]byte, error) {
|
||||
m, err := BytesToMap(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return json.Marshal(m)
|
||||
}
|
||||
|
||||
// FilesToMap merges multiple json files into one map, accepts remote url, or local file path
|
||||
func FilesToMap(args []string) (m map[string]interface{}, err error) {
|
||||
m, err = loadFiles(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = applyRules(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// BytesToMap merges multiple json contents into one map.
|
||||
func BytesToMap(args [][]byte) (m map[string]interface{}, err error) {
|
||||
m, err = loadBytes(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = applyRules(m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func loadFiles(args []string) (map[string]interface{}, error) {
|
||||
c := make(map[string]interface{})
|
||||
// JSONs merges multiple json contents into one json.
|
||||
func JSONs(args [][]byte) ([]byte, error) {
|
||||
m := make(map[string]interface{})
|
||||
for _, arg := range args {
|
||||
r, err := cmdarg.LoadArg(arg)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("fail to load %s: %s", arg, err)
|
||||
}
|
||||
m, err := decode(r)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("fail to decode %s: %s", arg, err)
|
||||
}
|
||||
if err = mergeMaps(c, m); err != nil {
|
||||
return nil, fmt.Errorf("fail to merge %s: %s", arg, err)
|
||||
}
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func loadBytes(args [][]byte) (map[string]interface{}, error) {
|
||||
conf := make(map[string]interface{})
|
||||
for _, arg := range args {
|
||||
r := bytes.NewReader(arg)
|
||||
m, err := decode(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = mergeMaps(conf, m); err != nil {
|
||||
if _, err := ToMap(arg, m); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return conf, nil
|
||||
return FromMap(m)
|
||||
}
|
||||
|
||||
func decode(r io.Reader) (map[string]interface{}, error) {
|
||||
c := make(map[string]interface{})
|
||||
err := serial.DecodeJSON(r, &c)
|
||||
// ToMap merges json content to target map and returns it
|
||||
func ToMap(content []byte, target map[string]interface{}) (map[string]interface{}, error) {
|
||||
if target == nil {
|
||||
target = make(map[string]interface{})
|
||||
}
|
||||
r := bytes.NewReader(content)
|
||||
n := make(map[string]interface{})
|
||||
err := serial.DecodeJSON(r, &n)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
if err = mergeMaps(target, n); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return target, nil
|
||||
}
|
||||
|
||||
// FromMap apply merge rules to map and convert it to json
|
||||
func FromMap(target map[string]interface{}) ([]byte, error) {
|
||||
if target == nil {
|
||||
target = make(map[string]interface{})
|
||||
}
|
||||
err := ApplyRules(target)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return json.Marshal(target)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user