| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package jsonfieldarray
- import (
- "encoding/json"
- "github.com/v2fly/v2ray-core/v5/app/subscription/containers"
- "github.com/v2fly/v2ray-core/v5/common"
- )
- // NewJSONFieldArrayParser internal api
- func NewJSONFieldArrayParser() containers.SubscriptionContainerDocumentParser {
- return newJSONFieldArrayParser()
- }
- func newJSONFieldArrayParser() containers.SubscriptionContainerDocumentParser {
- return &parser{}
- }
- type parser struct{}
- type jsonDocument map[string]json.RawMessage
- func (p parser) ParseSubscriptionContainerDocument(rawConfig []byte) (*containers.Container, error) {
- result := &containers.Container{}
- result.Kind = "JsonFieldArray"
- result.Metadata = make(map[string]string)
- var doc jsonDocument
- if err := json.Unmarshal(rawConfig, &doc); err != nil {
- return nil, newError("failed to parse as json").Base(err)
- }
- for key, value := range doc {
- switch value[0] {
- case '[':
- parsedArray, err := p.parseArray(value, "JsonFieldArray+"+key)
- if err != nil {
- return nil, newError("failed to parse as json array").Base(err)
- }
- result.ServerSpecs = append(result.ServerSpecs, parsedArray...)
- case '{':
- fallthrough
- default:
- result.Metadata[key] = string(value)
- }
- }
- return result, nil
- }
- func (p parser) parseArray(rawConfig []byte, kindHint string) ([]containers.UnparsedServerConf, error) {
- var result []json.RawMessage
- if err := json.Unmarshal(rawConfig, &result); err != nil {
- return nil, newError("failed to parse as json array").Base(err)
- }
- var ret []containers.UnparsedServerConf
- for _, value := range result {
- ret = append(ret, containers.UnparsedServerConf{
- KindHint: kindHint,
- Content: []byte(value),
- })
- }
- return ret, nil
- }
- func init() {
- common.Must(containers.RegisterParser("JsonFieldArray", newJSONFieldArrayParser()))
- }
|