You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

repl.go 1.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package repl
  2. import (
  3. "context"
  4. "os"
  5. "strings"
  6. "github.com/c-bata/go-prompt"
  7. "github.com/spf13/cobra"
  8. "gitlink.org.cn/cloudream/common/pkgs/async"
  9. "gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
  10. "gitlink.org.cn/cloudream/jcs-pub/client/internal/ticktock"
  11. "golang.org/x/term"
  12. )
  13. var (
  14. cmdCtxKey = &CommandContext{}
  15. )
  16. type ReplEventChan = async.UnboundChannel[ReplEvent]
  17. type ReplEvent interface {
  18. IsReplEvent() bool
  19. }
  20. type ExitEvent struct {
  21. ReplEvent
  22. }
  23. type Repl struct {
  24. prompt *prompt.Prompt
  25. evtCh *ReplEventChan
  26. db *db.DB
  27. tktk *ticktock.TickTock
  28. }
  29. func New(db *db.DB, ticktock *ticktock.TickTock) *Repl {
  30. r := &Repl{
  31. evtCh: async.NewUnboundChannel[ReplEvent](),
  32. db: db,
  33. tktk: ticktock,
  34. }
  35. r.prompt = prompt.New(
  36. r.executor,
  37. r.completer,
  38. prompt.OptionPrefix(">>> "),
  39. prompt.OptionTitle("JCS"),
  40. prompt.OptionSetExitCheckerOnInput(r.exitChecker),
  41. )
  42. return r
  43. }
  44. func (r *Repl) Start() *ReplEventChan {
  45. go func() {
  46. if term.IsTerminal(int(os.Stdin.Fd())) {
  47. r.prompt = prompt.New(
  48. r.executor,
  49. r.completer,
  50. prompt.OptionPrefix(">>> "),
  51. prompt.OptionTitle("JCS Coordinator REPL"),
  52. prompt.OptionSetExitCheckerOnInput(r.exitChecker),
  53. )
  54. r.prompt.Run()
  55. r.evtCh.Send(ExitEvent{})
  56. }
  57. }()
  58. return r.evtCh
  59. }
  60. func (r *Repl) completer(d prompt.Document) []prompt.Suggest {
  61. return nil
  62. }
  63. func (r *Repl) executor(input string) {
  64. fields := strings.Fields(input)
  65. if len(fields) == 0 {
  66. return
  67. }
  68. RootCmd.SetArgs(fields)
  69. RootCmd.ExecuteContext(context.WithValue(context.Background(), cmdCtxKey, &CommandContext{
  70. repl: r,
  71. }))
  72. }
  73. func (r *Repl) exitChecker(input string, breakline bool) bool {
  74. if breakline && input == "exit" {
  75. return true
  76. }
  77. return false
  78. }
  79. var RootCmd = &cobra.Command{}
  80. type CommandContext struct {
  81. repl *Repl
  82. }
  83. func GetCmdCtx(cmd *cobra.Command) *CommandContext {
  84. return cmd.Context().Value(cmdCtxKey).(*CommandContext)
  85. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。