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.

utils.go 3.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package cmd
  2. import (
  3. "encoding"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "strings"
  8. "github.com/chzyer/readline"
  9. )
  10. func SplitObjectPath(str string) (bkt string, pkg string, obj string, ok bool) {
  11. comps := strings.Split(str, ":")
  12. if len(comps) != 2 {
  13. return "", "", "", false
  14. }
  15. pat := comps[1]
  16. comps = strings.Split(comps[0], "/")
  17. if len(comps) != 2 {
  18. return "", "", "", false
  19. }
  20. return comps[0], comps[1], pat, true
  21. }
  22. func SelectOne(rl *readline.Instance, prompt string, options []string) int {
  23. fmt.Printf("\033[36m%v: \033[0m\n", prompt)
  24. for i, option := range options {
  25. fmt.Printf("%d. %s\n", i+1, option)
  26. }
  27. rl.SetPrompt("请输入选项编号: ")
  28. for {
  29. str, err := rl.Readline()
  30. if err != nil {
  31. os.Exit(0)
  32. }
  33. idx, err := strconv.ParseInt(str, 10, 64)
  34. if err != nil {
  35. fmt.Println("无效的编号, 请重新输入")
  36. continue
  37. }
  38. if idx < 1 || idx > int64(len(options)) {
  39. fmt.Println("无效的编号, 请重新输入")
  40. continue
  41. }
  42. return int(idx - 1)
  43. }
  44. }
  45. func ReadString(rl *readline.Instance, prompt string) string {
  46. rl.SetPrompt(fmt.Sprintf("%v: ", prompt))
  47. str, err := rl.Readline()
  48. if err != nil {
  49. os.Exit(0)
  50. }
  51. return str
  52. }
  53. func ReadStringDef(rl *readline.Instance, prompt string, def string) string {
  54. rl.SetPrompt(fmt.Sprintf("%v(默认: %s): ", prompt, def))
  55. str, err := rl.Readline()
  56. if err != nil {
  57. os.Exit(0)
  58. }
  59. if str == "" {
  60. return def
  61. }
  62. return str
  63. }
  64. func ReadStringValue[T encoding.TextUnmarshaler](rl *readline.Instance, prompt string, v T) {
  65. rl.SetPrompt(fmt.Sprintf("%v: ", prompt))
  66. for {
  67. str, err := rl.Readline()
  68. if err != nil {
  69. os.Exit(0)
  70. }
  71. err = v.UnmarshalText([]byte(str))
  72. if err != nil {
  73. fmt.Printf("%v, 请重新输入\n", err)
  74. continue
  75. }
  76. break
  77. }
  78. }
  79. func ReadInt(rl *readline.Instance, prompt string) int {
  80. rl.SetPrompt(fmt.Sprintf("%v: ", prompt))
  81. for {
  82. str, err := rl.Readline()
  83. if err != nil {
  84. os.Exit(0)
  85. }
  86. idx, err := strconv.ParseInt(str, 10, 64)
  87. if err != nil {
  88. fmt.Println("无效的输入, 请重新输入")
  89. continue
  90. }
  91. return int(idx)
  92. }
  93. }
  94. func ReadIntRanged(rl *readline.Instance, prompt string, min, max int) int {
  95. rl.SetPrompt(fmt.Sprintf("%v(%d-%d): ", prompt, min, max))
  96. for {
  97. str, err := rl.Readline()
  98. if err != nil {
  99. os.Exit(0)
  100. }
  101. idx, err := strconv.ParseInt(str, 10, 64)
  102. if err != nil {
  103. fmt.Println("无效的输入, 请重新输入")
  104. continue
  105. }
  106. if idx < int64(min) || idx > int64(max) {
  107. fmt.Printf("输入值必须在%d-%d之间, 请重新输入\n", min, max)
  108. continue
  109. }
  110. return int(idx)
  111. }
  112. }
  113. func ReadPassword(rl *readline.Instance, prompt string) []byte {
  114. pwd, err := rl.ReadPassword(fmt.Sprintf("%v: ", prompt))
  115. if err != nil {
  116. os.Exit(0)
  117. }
  118. return pwd
  119. }
  120. func ReadBool(rl *readline.Instance, prompt string) bool {
  121. rl.SetPrompt(fmt.Sprintf("\033[36m%v(y/n): \033[0m", prompt))
  122. for {
  123. str, err := rl.Readline()
  124. if err != nil {
  125. os.Exit(0)
  126. }
  127. if str == "y" || str == "Y" {
  128. return true
  129. }
  130. if str == "n" || str == "N" {
  131. return false
  132. }
  133. fmt.Println("无效的输入, 请重新输入")
  134. }
  135. }

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