Browse Source

add jsonv5 conf loader

Shelikhoo 4 years ago
parent
commit
7bf1d7a1ce
2 changed files with 56 additions and 0 deletions
  1. 40 0
      infra/conf/v5cfg/init.go
  2. 16 0
      infra/conf/v5cfg/root.go

+ 40 - 0
infra/conf/v5cfg/init.go

@@ -0,0 +1,40 @@
+package v5cfg
+
+import (
+	core "github.com/v2fly/v2ray-core/v4"
+	"github.com/v2fly/v2ray-core/v4/common"
+	"github.com/v2fly/v2ray-core/v4/common/buf"
+	"github.com/v2fly/v2ray-core/v4/common/cmdarg"
+	"io"
+)
+
+const jsonV5 = "jsonv5"
+
+func init() {
+	common.Must(core.RegisterConfigLoader(&core.ConfigFormat{
+		Name:      []string{jsonV5},
+		Extension: []string{".json"},
+		Loader: func(input interface{}) (*core.Config, error) {
+			switch v := input.(type) {
+			case string:
+				r, err := cmdarg.LoadArg(v)
+				if err != nil {
+					return nil, err
+				}
+				data, err := buf.ReadAllToBytes(r)
+				if err != nil {
+					return nil, err
+				}
+				return loadJsonConfig(data)
+			case io.Reader:
+				data, err := buf.ReadAllToBytes(v)
+				if err != nil {
+					return nil, err
+				}
+				return loadJsonConfig(data)
+			default:
+				return nil, newError("unknown type")
+			}
+		},
+	}))
+}

+ 16 - 0
infra/conf/v5cfg/root.go

@@ -2,6 +2,7 @@ package v5cfg
 
 import (
 	"context"
+	"encoding/json"
 	"github.com/golang/protobuf/proto"
 	core "github.com/v2fly/v2ray-core/v4"
 	"github.com/v2fly/v2ray-core/v4/app/dispatcher"
@@ -71,3 +72,18 @@ func (c RootConfig) BuildV5(ctx context.Context) (proto.Message, error) {
 	}
 	return config, nil
 }
+
+func loadJsonConfig(data []byte) (*core.Config, error) {
+	rootConfig := &RootConfig{}
+
+	err := json.Unmarshal(data, rootConfig)
+	if err != nil {
+		return nil, newError("unable to load json").Base(err)
+	}
+
+	message, err := rootConfig.BuildV5(context.TODO())
+	if err != nil {
+		return nil, newError("unable to build config").Base(err)
+	}
+	return message.(*core.Config), nil
+}