diff --git a/cmd/cmd_parse.go b/cmd/cmd_parse.go new file mode 100644 index 0000000..c4ab148 --- /dev/null +++ b/cmd/cmd_parse.go @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/hiddify/libcore/config" + "github.com/sagernet/sing-box/log" + "github.com/spf13/cobra" +) + +var commandParseOutputPath string + +var commandParse = &cobra.Command{ + Use: "parse", + Short: "Parse configuration", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + err := parse(args[0]) + if err != nil { + log.Fatal(err) + } + }, +} + +func init() { + commandParse.Flags().StringVarP(&commandParseOutputPath, "output", "o", "", "write result to file path instead of stdout") + mainCommand.AddCommand(commandParse) +} + +func parse(path string) error { + if workingDir != "" { + path = filepath.Join(workingDir, path) + } + config, err := config.ParseConfig(path, true) + if err != nil { + return err + } + if commandParseOutputPath != "" { + outputPath, _ := filepath.Abs(filepath.Join(workingDir, commandParseOutputPath)) + err = os.WriteFile(outputPath, config, 0777) + if err != nil { + return err + } + fmt.Println("result successfully written to ", outputPath) + } else { + os.Stdout.Write(config) + } + return nil +} diff --git a/config/parser.go b/config/parser.go index b5ef618..c80ce1d 100644 --- a/config/parser.go +++ b/config/parser.go @@ -22,10 +22,10 @@ var configParsers = []func([]byte, bool) ([]byte, error){ parseClashConfig, } -func ParseConfig(path string, tempPath string, debug bool) error { - content, err := os.ReadFile(tempPath) +func ParseConfig(path string, debug bool) ([]byte, error) { + content, err := os.ReadFile(path) if err != nil { - return err + return nil, err } var parseError error @@ -34,15 +34,11 @@ func ParseConfig(path string, tempPath string, debug bool) error { if err == nil { fmt.Printf("[ConfigParser] success with parser #%d, checking...\n", index) err = libbox.CheckConfig(string(config)) - if err != nil { - return err - } - err = os.WriteFile(path, config, 0777) - return err + return config, err } parseError = err } - return parseError + return nil, parseError } func parseV2rayConfig(content []byte, debug bool) ([]byte, error) { diff --git a/custom/custom.go b/custom/custom.go index 32b8091..32c64d8 100644 --- a/custom/custom.go +++ b/custom/custom.go @@ -59,7 +59,11 @@ func parse(path *C.char, tempPath *C.char, debug bool) (CErr *C.char) { CErr = C.CString(err.Error()) }) - err := config.ParseConfig(C.GoString(path), C.GoString(tempPath), debug) + config, err := config.ParseConfig(C.GoString(tempPath), debug) + if err != nil { + return C.CString(err.Error()) + } + err = os.WriteFile(C.GoString(path), config, 0777) if err != nil { return C.CString(err.Error()) } diff --git a/mobile/mobile.go b/mobile/mobile.go index 5a9a037..bbb1241 100644 --- a/mobile/mobile.go +++ b/mobile/mobile.go @@ -10,7 +10,11 @@ import ( ) func Parse(path string, tempPath string, debug bool) error { - return config.ParseConfig(path, tempPath, debug) + config, err := config.ParseConfig(tempPath, debug) + if err != nil { + return err + } + return os.WriteFile(path, config, 0777) } func BuildConfig(path string, configOptionsJson string) (string, error) {