mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-10-03 09:16:14 -04:00
38 lines
1.2 KiB
Go
38 lines
1.2 KiB
Go
package v5cfg
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"github.com/golang/protobuf/jsonpb"
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/v2fly/v2ray-core/v4/common/registry"
|
|
"github.com/v2fly/v2ray-core/v4/common/serial"
|
|
"strings"
|
|
)
|
|
|
|
func loadHeterogeneousConfigFromRawJson(interfaceType, name string, rawJson json.RawMessage) (proto.Message, error) {
|
|
var implementationFullName string
|
|
if strings.HasPrefix(name, "#") {
|
|
// skip resolution for full name
|
|
implementationFullName = name
|
|
} else {
|
|
registryResult, err := registry.FindImplementationByAlias(interfaceType, name)
|
|
if err != nil {
|
|
return nil, newError("unable to find implementation").Base(err)
|
|
}
|
|
implementationFullName = registryResult
|
|
}
|
|
implementationConfigInstance, err := serial.GetInstance(implementationFullName)
|
|
if err != nil {
|
|
return nil, newError("unable to create implementation config instance").Base(err)
|
|
}
|
|
|
|
unmarshaler := jsonpb.Unmarshaler{AllowUnknownFields: false}
|
|
err = unmarshaler.Unmarshal(bytes.NewReader([]byte(rawJson)), implementationConfigInstance.(proto.Message))
|
|
if err != nil {
|
|
return nil, newError("unable to parse json content").Base(err)
|
|
}
|
|
|
|
return implementationConfigInstance.(proto.Message), nil
|
|
}
|