parser.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package jsonfieldarray
  2. import (
  3. "encoding/json"
  4. "github.com/v2fly/v2ray-core/v5/app/subscription/containers"
  5. "github.com/v2fly/v2ray-core/v5/common"
  6. )
  7. // NewJSONFieldArrayParser internal api
  8. func NewJSONFieldArrayParser() containers.SubscriptionContainerDocumentParser {
  9. return newJSONFieldArrayParser()
  10. }
  11. func newJSONFieldArrayParser() containers.SubscriptionContainerDocumentParser {
  12. return &parser{}
  13. }
  14. type parser struct{}
  15. type jsonDocument map[string]json.RawMessage
  16. func (p parser) ParseSubscriptionContainerDocument(rawConfig []byte) (*containers.Container, error) {
  17. result := &containers.Container{}
  18. result.Kind = "JsonFieldArray"
  19. result.Metadata = make(map[string]string)
  20. var doc jsonDocument
  21. if err := json.Unmarshal(rawConfig, &doc); err != nil {
  22. return nil, newError("failed to parse as json").Base(err)
  23. }
  24. for key, value := range doc {
  25. switch value[0] {
  26. case '[':
  27. parsedArray, err := p.parseArray(value, "JsonFieldArray+"+key)
  28. if err != nil {
  29. return nil, newError("failed to parse as json array").Base(err)
  30. }
  31. result.ServerSpecs = append(result.ServerSpecs, parsedArray...)
  32. case '{':
  33. fallthrough
  34. default:
  35. result.Metadata[key] = string(value)
  36. }
  37. }
  38. return result, nil
  39. }
  40. func (p parser) parseArray(rawConfig []byte, kindHint string) ([]containers.UnparsedServerConf, error) {
  41. var result []json.RawMessage
  42. if err := json.Unmarshal(rawConfig, &result); err != nil {
  43. return nil, newError("failed to parse as json array").Base(err)
  44. }
  45. var ret []containers.UnparsedServerConf
  46. for _, value := range result {
  47. ret = append(ret, containers.UnparsedServerConf{
  48. KindHint: kindHint,
  49. Content: []byte(value),
  50. })
  51. }
  52. return ret, nil
  53. }
  54. func init() {
  55. common.Must(containers.RegisterParser("JsonFieldArray", newJSONFieldArrayParser()))
  56. }