nonnativelinkexec.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package engineering
  2. import (
  3. "bytes"
  4. "flag"
  5. "io"
  6. "os"
  7. "github.com/v2fly/v2ray-core/v5/app/subscription/entries/nonnative"
  8. "github.com/v2fly/v2ray-core/v5/main/commands/base"
  9. )
  10. var cmdNonNativeLinkExecInputName *string
  11. var cmdNonNativeLinkExecTemplatePath *string
  12. var cmdNonNativeLinkExec = &base.Command{
  13. UsageLine: "{{.Exec}} engineering nonnativelinkexec",
  14. Flag: func() flag.FlagSet {
  15. fs := flag.NewFlagSet("", flag.ExitOnError)
  16. cmdNonNativeLinkExecInputName = fs.String("name", "", "")
  17. cmdNonNativeLinkExecTemplatePath = fs.String("templatePath", "", "path for template directory (WARNING: This will not stop templates from reading file outside this directory)")
  18. return *fs
  19. }(),
  20. Run: func(cmd *base.Command, args []string) {
  21. cmd.Flag.Parse(args)
  22. content, err := io.ReadAll(os.Stdin)
  23. if err != nil {
  24. base.Fatalf("%s", err)
  25. }
  26. flattenedLink := nonnative.ExtractAllValuesFromBytes(content)
  27. matcher := nonnative.NewDefMatcher()
  28. if *cmdNonNativeLinkExecTemplatePath != "" {
  29. osFs := os.DirFS(*cmdNonNativeLinkExecTemplatePath)
  30. err = matcher.LoadDefinitions(osFs)
  31. if err != nil {
  32. base.Fatalf("%s", err)
  33. }
  34. } else {
  35. err = matcher.LoadEmbeddedDefinitions()
  36. if err != nil {
  37. base.Fatalf("%s", err)
  38. }
  39. }
  40. spec, err := matcher.ExecuteNamed(flattenedLink, *cmdNonNativeLinkExecInputName)
  41. if err != nil {
  42. base.Fatalf("%s", err)
  43. }
  44. io.Copy(os.Stdout, bytes.NewReader(spec))
  45. },
  46. }