Files
umbrix-libcore/shared/parser.go

77 lines
1.6 KiB
Go
Raw Normal View History

2023-08-19 14:08:39 +03:30
package shared
import (
2023-08-20 23:50:13 +03:30
_ "embed"
2023-08-19 14:08:39 +03:30
"fmt"
"os"
2023-09-09 14:06:54 +00:00
"github.com/er888kh/go-subconverter/converter"
2023-08-19 14:08:39 +03:30
"github.com/sagernet/sing-box/experimental/libbox"
"github.com/xmdhs/clash2singbox/convert"
"github.com/xmdhs/clash2singbox/model/clash"
"gopkg.in/yaml.v3"
)
2023-08-20 23:50:13 +03:30
//go:embed config.json.template
var configByte []byte
2023-08-19 14:08:39 +03:30
func ParseConfig(path string) error {
content, err := os.ReadFile(path)
if err != nil {
return err
}
2023-09-09 14:06:54 +00:00
clash_conf, err := parseV2rayFormat(content)
if err == nil {
content = clash_conf
}
2023-08-19 14:08:39 +03:30
config, err := parseClash(content)
if err != nil {
config = content
}
err = libbox.CheckConfig(string(config))
if err != nil {
return err
}
err = os.WriteFile(path, config, 0777)
if err != nil {
return err
}
return nil
}
2023-09-09 14:06:54 +00:00
func parseV2rayFormat(content []byte) ([]byte, error) {
clash_conf, err := converter.ParseConfig(string(content), "full")
if err != nil {
fmt.Printf("error: %v\n", err)
return nil, err
}
clash_conf_yaml, err := yaml.Marshal(clash_conf)
if err != nil {
fmt.Printf("error: %v\n", err)
return nil, err
}
fmt.Printf("clash_conf: %s\n", clash_conf_yaml) // Print YAML as string
return clash_conf_yaml, nil
}
2023-08-19 14:08:39 +03:30
func parseClash(content []byte) ([]byte, error) {
clashConfig := clash.Clash{}
err := yaml.Unmarshal(content, &clashConfig)
if err != nil {
fmt.Printf("unmarshal error %s", err)
return nil, err
}
sbConfig, err := convert.Clash2sing(clashConfig)
if err != nil {
fmt.Printf("convert error %s", err)
return nil, err
}
2023-08-20 23:50:13 +03:30
output := configByte
2023-08-19 14:08:39 +03:30
output, err = convert.Patch(output, sbConfig, "", "", nil)
if err != nil {
fmt.Printf("patch error %s", err)
return nil, err
}
return output, nil
}