162 lines
3.0 KiB
Go
162 lines
3.0 KiB
Go
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("无效的输入, 请重新输入")
|
|
}
|
|
}
|