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 2.0 kB

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

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