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

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

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