JCS-pub/jcsctl/cmd/utils.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("无效的输入, 请重新输入")
}
}