Skip to content

Commit

Permalink
⚡️ Improve
Browse files Browse the repository at this point in the history
  • Loading branch information
nitezs committed Aug 4, 2024
1 parent 5395417 commit 5afb06b
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 40 deletions.
30 changes: 15 additions & 15 deletions model/vmess.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package model

type VmessJson struct {
V string `json:"v"`
Ps string `json:"ps"`
Add string `json:"add"`
Port interface{} `json:"port"`
Id string `json:"id"`
Aid interface{} `json:"aid"`
Scy string `json:"scy"`
Net string `json:"net"`
Type string `json:"type"`
Host string `json:"host"`
Path string `json:"path"`
Tls string `json:"tls"`
Sni string `json:"sni"`
Alpn string `json:"alpn"`
Fp string `json:"fp"`
V string `json:"v"`
Ps string `json:"ps"`
Add string `json:"add"`
Port any `json:"port"`
Id string `json:"id"`
Aid any `json:"aid"`
Scy string `json:"scy"`
Net string `json:"net"`
Type string `json:"type"`
Host string `json:"host"`
Path string `json:"path"`
Tls string `json:"tls"`
Sni string `json:"sni"`
Alpn string `json:"alpn"`
Fp string `json:"fp"`
}

type VMessOutboundOptions struct {
Expand Down
25 changes: 0 additions & 25 deletions util/marshal.go

This file was deleted.

78 changes: 78 additions & 0 deletions util/merge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package util

import (
"encoding/json"
"fmt"
"reflect"
)

func MergeAndMarshal(s1, s2 any) (string, error) {
merged, err := mergeStructs(s1, s2)
if err != nil {
return "", err
}
jsonBytes, err := json.Marshal(merged)
if err != nil {
return "", err
}
return string(jsonBytes), nil
}

func mergeStructs(s1, s2 any) (any, error) {
v1 := reflect.ValueOf(s1)
v2 := reflect.ValueOf(s2)

if v1.Kind() == reflect.Pointer {
v1 = v1.Elem()
}
if v2.Kind() == reflect.Pointer {
v2 = v2.Elem()
}

if v1.Kind() != reflect.Struct || v2.Kind() != reflect.Struct {
return nil, fmt.Errorf("both arguments must be structs")
}

t1 := v1.Type()
t2 := v2.Type()

var fields []reflect.StructField
var fieldsSet = make(map[string]reflect.Type)
for i := 0; i < t1.NumField(); i++ {
field := t1.Field(i)
fields = append(fields, field)
fieldsSet[field.Name] = field.Type
}

for i := 0; i < t2.NumField(); i++ {
field := t2.Field(i)
if existingType, ok := fieldsSet[field.Name]; ok {
if existingType != field.Type {
return nil, fmt.Errorf("field %s has conflicting types: %s and %s", field.Name, existingType, field.Type)
}
} else {
fields = append(fields, field)
fieldsSet[field.Name] = field.Type
}
}

newType := reflect.StructOf(fields)

newValue := reflect.New(newType).Elem()

for i := 0; i < t1.NumField(); i++ {
valueField := newValue.FieldByName(t1.Field(i).Name)
if valueField.IsValid() {
valueField.Set(v1.Field(i))
}
}

for i := 0; i < t2.NumField(); i++ {
valueField := newValue.FieldByName(t2.Field(i).Name)
if valueField.IsValid() {
valueField.Set(v2.Field(i))
}
}

return newValue.Interface(), nil
}

0 comments on commit 5afb06b

Please sign in to comment.