package cmd import ( "encoding" "fmt" "os" "strconv" "strings" "github.com/chzyer/readline" ) func SplitObjectPath(str string) (bkt string, pkg string, obj string, ok bool) { comps := strings.Split(str, ":") if len(comps) != 2 { return "", "", "", false } pat := comps[1] comps = strings.Split(comps[0], "/") if len(comps) != 2 { return "", "", "", false } return comps[0], comps[1], pat, true } func SelectOne(rl *readline.Instance, prompt string, options []string) int { fmt.Printf("\033[36m%v: \033[0m\n", prompt) for i, option := range options { fmt.Printf("%d. %s\n", i+1, option) } rl.SetPrompt("请输入选项编号: ") for { str, err := rl.Readline() if err != nil { os.Exit(0) } idx, err := strconv.ParseInt(str, 10, 64) if err != nil { fmt.Println("无效的编号, 请重新输入") continue } if idx < 1 || idx > int64(len(options)) { fmt.Println("无效的编号, 请重新输入") continue } return int(idx - 1) } } func ReadString(rl *readline.Instance, prompt string) string { rl.SetPrompt(fmt.Sprintf("%v: ", prompt)) str, err := rl.Readline() if err != nil { os.Exit(0) } return str } func ReadStringDef(rl *readline.Instance, prompt string, def string) string { rl.SetPrompt(fmt.Sprintf("%v(默认: %s): ", prompt, def)) str, err := rl.Readline() if err != nil { os.Exit(0) } if str == "" { return def } return str } func ReadStringValue[T encoding.TextUnmarshaler](rl *readline.Instance, prompt string, v T) { rl.SetPrompt(fmt.Sprintf("%v: ", prompt)) for { str, err := rl.Readline() if err != nil { os.Exit(0) } err = v.UnmarshalText([]byte(str)) if err != nil { fmt.Printf("%v, 请重新输入\n", err) continue } break } } func ReadInt(rl *readline.Instance, prompt string) int { rl.SetPrompt(fmt.Sprintf("%v: ", prompt)) for { str, err := rl.Readline() if err != nil { os.Exit(0) } idx, err := strconv.ParseInt(str, 10, 64) if err != nil { fmt.Println("无效的输入, 请重新输入") continue } return int(idx) } } func ReadIntRanged(rl *readline.Instance, prompt string, min, max int) int { rl.SetPrompt(fmt.Sprintf("%v(%d-%d): ", prompt, min, max)) for { str, err := rl.Readline() if err != nil { os.Exit(0) } idx, err := strconv.ParseInt(str, 10, 64) if err != nil { fmt.Println("无效的输入, 请重新输入") continue } if idx < int64(min) || idx > int64(max) { fmt.Printf("输入值必须在%d-%d之间, 请重新输入\n", min, max) continue } return int(idx) } } func ReadPassword(rl *readline.Instance, prompt string) []byte { pwd, err := rl.ReadPassword(fmt.Sprintf("%v: ", prompt)) if err != nil { os.Exit(0) } return pwd } func ReadBool(rl *readline.Instance, prompt string) bool { rl.SetPrompt(fmt.Sprintf("\033[36m%v(y/n): \033[0m", prompt)) for { str, err := rl.Readline() if err != nil { os.Exit(0) } if str == "y" || str == "Y" { return true } if str == "n" || str == "N" { return false } fmt.Println("无效的输入, 请重新输入") } }