| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // Copyright 2020 Jebbs. All rights reserved.
- // Use of this source code is governed by MIT
- // license that can be found in the LICENSE file.
- /*
- Package merge provides the capbility to merge multiple
- JSON files or contents into one output.
- Merge Rules:
- - Simple values (string, number, boolean) are overwritten, others are merged
- - Elements with same "tag" (or "_tag") in an array will be merged
- - Add "_priority" property to array elements will help sort the
- */
- package merge
- import (
- "bytes"
- "encoding/json"
- "github.com/v2fly/v2ray-core/v4/infra/conf/serial"
- )
- // JSONs merges multiple json contents into one json.
- func JSONs(args [][]byte) ([]byte, error) {
- m := make(map[string]interface{})
- for _, arg := range args {
- if _, err := ToMap(arg, m); err != nil {
- return nil, err
- }
- }
- return FromMap(m)
- }
- // 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
- }
- 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)
- }
|