ZVVQ代理分享网

使用promptui 在 Go 中嵌套提示(go接口嵌套)

作者:zvvq博客网
导读我最近正在开发一个用 go 编写的 cli 工具,最近使用了 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我使用 promptui 作为提示,但找不到直接的方法来执行此操作。这篇

我最近正在开发一个用 go 编写的 cli 工具,最近使用了 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我使用 promptui 作为提示,但找不到直接的方法来执行此操作。这篇短文将展示如何使用promptui 创建嵌套提示。完整的代码可以在这里找到。

内容来自samhan666

我们首先需要创建一个空的Go项目。我们将其称为嵌套提示:

内容来自samhan

1 zvvq好,好zvvq

2

zvvq

$ mkdir 嵌套提示 && cd 嵌套提示 copyright zvvq

$ go mod init <a style="color:f60; text-decoration:underline;" href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.com/Thwani47/nested-prompt

本文来自zvvq

然后我们将安装 cobra、cobra-cli 和 Promptui 软件包:

内容来自zvvq,别采集哟

1

zvvq.cn

2 本文来自zvvq

3 zvvq

$ go get -u github.com/spf13/cobra@latest 本文来自zvvq

$ 去安装 github.com/spf13/cobra-cli@latest

zvvq

$ go get -u github.com/manifoldco/promptui

内容来自samhan

我们可以使用 cobra-cli 初始化一个新的 CLI 应用程序,并向我们的 CLI 添加命令

内容来自zvvq

1

内容来自zvvq,别采集哟

2 内容来自zvvq,别采集哟

$ cobra-cli init 初始化一个新的 CLI 应用程序

本文来自zvvq

$ cobra-cli add config 在 CLI 中添加一个名为 config 的新命令

内容来自zvvq,别采集哟

我们可以清理cmd/config.go文件并删除所有注释。应该是这样的:

zvvq

1 zvvq.cn

2

zvvq.cn

3 内容来自samhan

4

zvvq

5

内容来自samhan

6

copyright zvvq

7

zvvq好,好zvvq

8

内容来自samhan

9

copyright zvvq

10

内容来自samhan

11

内容来自samhan666

12

内容来自zvvq

13

zvvq好,好zvvq

14 内容来自zvvq,别采集哟

15

本文来自zvvq

16 本文来自zvvq

17

zvvq

18 内容来自samhan

19 copyright zvvq

20

内容来自samhan

21 内容来自samhan666

//cmd/config.go

copyright zvvq

包命令 内容来自samhan666

进口 (

内容来自samhan666

“FMMT” 内容来自samhan666

“github.com/spf13/cobra” 内容来自samhan

copyright zvvq

var configCmd = &amp;cobra.Command{ zvvq.cn

使用:“配置”, copyright zvvq

简短:“配置应用程序的设置”, 内容来自samhan

长:“配置应用程序的设置”,

本文来自zvvq

运行: func(cmd cobra.Command, args []string) { 内容来自zvvq,别采集哟

fmt.Println("配置被调用")

内容来自zvvq

}, 内容来自samhan666

}

本文来自zvvq

函数初始化{

内容来自samhan666

rootCmd.AddCommand(configCmd)

内容来自samhan666

} 内容来自samhan

我们首先需要为我们的提示创建一个自定义类型。我们通过定义一个提示项目结构来做到这一点,如下所示 copyright zvvq

1

zvvq.cn

2 zvvq.cn

3

copyright zvvq

4

zvvq.cn

5 zvvq

6 内容来自samhan

7 内容来自zvvq

8

copyright zvvq

9

本文来自zvvq

10

内容来自samhan666

11 zvvq好,好zvvq

12

zvvq好,好zvvq

13

内容来自zvvq

14 zvvq好,好zvvq

15

zvvq好,好zvvq

type PromptType int

内容来自samhan666

常量(

zvvq好,好zvvq

文本提示提示类型 = 0 本文来自zvvq

密码提示提示类型 = 1

内容来自samhan666

选择提示提示类型 = 2 内容来自samhan666

copyright zvvq

类型提示项目结构{

内容来自zvvq,别采集哟

ID字符串

内容来自samhan

标签字符串 copyright zvvq

值字符串 内容来自samhan666

选择选项[]字符串

本文来自zvvq

提示类型 提示类型

zvvq好,好zvvq

} 内容来自samhan666

PromptType 枚举允许我们从提示中收集不同类型的输入,我们可以提示用户输入文本或敏感值(例如密码或 API 密钥),或者提示用户从定义值列表中进行选择

zvvq

然后我们定义一个promptInput函数来提示用户输入。该函数返回用户输入的字符串值,如果提示失败则返回错误。 zvvq

1

内容来自samhan666

2 zvvq.cn

3 内容来自zvvq

4

内容来自zvvq

5 内容来自zvvq,别采集哟

6 zvvq好,好zvvq

7

内容来自zvvq

8

内容来自zvvq,别采集哟

9 zvvq

10 内容来自samhan666

11 copyright zvvq

12

本文来自zvvq

13

内容来自zvvq,别采集哟

14

内容来自samhan666

15 copyright zvvq

16 内容来自samhan

17 内容来自samhan666

18 内容来自samhan

19

内容来自samhan

func提示输入(项目提示项目)(字符串,错误){ zvvq.cn

提示:=提示ui.提示{ 内容来自zvvq

标签:项目.标签, 内容来自zvvq,别采集哟

隐藏输入:true,

zvvq

} 内容来自zvvq

if item.promptType == PasswordPrompt { 内容来自samhan666

提示.Mask = 内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

res, err := 提示.Run()

内容来自zvvq

如果错误!= nil { 内容来自zvvq

fmt.Printf("提示失败%vn", err)

内容来自zvvq

返回“”,错误 本文来自zvvq

}

内容来自samhan666

返回资源,无

zvvq好,好zvvq

} 内容来自samhan666

然后我们定义一个 PromptSelect 函数,允许用户从选项列表中进行选择。该函数返回用户选择的字符串值,如果提示失败则返回错误。

本文来自zvvq

1 内容来自samhan

2 内容来自samhan666

3 内容来自zvvq,别采集哟

4

内容来自samhan666

5

内容来自zvvq

6

zvvq好,好zvvq

7

内容来自samhan

8

内容来自samhan

9

zvvq

10

内容来自zvvq,别采集哟

11

zvvq好,好zvvq

12

内容来自zvvq

13

内容来自zvvq,别采集哟

14 内容来自zvvq

15 内容来自samhan

16 zvvq好,好zvvq

func提示选择(项目选择项目)(字符串,错误){ 内容来自samhan

提示:=提示ui.选择{ 本文来自zvvq

标签:项目.标签, 内容来自zvvq

项目:item.SelectValues, 内容来自zvvq,别采集哟

隐藏所选:true, zvvq好,好zvvq

} 本文来自zvvq

_, 结果, 错误 := 提示.Run()

内容来自zvvq,别采集哟

如果错误!= nil { 内容来自zvvq

fmt.Printf("提示失败%vn", err)

zvvq.cn

返回“”,错误 内容来自samhan666

}

内容来自zvvq

返回结果,无

内容来自zvvq

} copyright zvvq

为了模拟嵌套提示,我们将创建一个 PromptNested 函数,该函数将允许我们提示用户输入值,并且提示将保持活动状态,直到用户选择“完成”。该函数返回一个布尔值,表示提示成功。

本文来自zvvq

函数中的注释解释了每个主要代码块的职责

内容来自samhan

1

copyright zvvq

2 内容来自zvvq,别采集哟

3

zvvq

4

内容来自samhan

5

zvvq好,好zvvq

6

本文来自zvvq

7 zvvq

8

zvvq

9 内容来自zvvq

10 zvvq

11 zvvq好,好zvvq

12 内容来自samhan666

13 zvvq.cn

14

本文来自zvvq

15 内容来自zvvq

16

内容来自samhan666

17

zvvq好,好zvvq

18 本文来自zvvq

19 内容来自zvvq

20 内容来自samhan666

21

zvvq好,好zvvq

22

本文来自zvvq

23

zvvq好,好zvvq

24 内容来自zvvq

25 zvvq.cn

26 内容来自samhan666

27 内容来自zvvq

28

zvvq.cn

29 zvvq好,好zvvq

30 内容来自zvvq,别采集哟

31

zvvq

32 zvvq

33

zvvq

34

内容来自zvvq,别采集哟

35

copyright zvvq

36

本文来自zvvq

37 zvvq好,好zvvq

38

zvvq好,好zvvq

39 zvvq

40 copyright zvvq

41

copyright zvvq

42

zvvq

43

内容来自zvvq,别采集哟

44

内容来自samhan666

45

zvvq

46

zvvq

47 copyright zvvq

48 zvvq好,好zvvq

49 zvvq

50

本文来自zvvq

51

zvvq.cn

52 内容来自zvvq

53

内容来自samhan666

54

内容来自samhan

55

本文来自zvvq

56

内容来自samhan666

57 本文来自zvvq

58

copyright zvvq

59 本文来自zvvq

60 内容来自zvvq,别采集哟

61 内容来自samhan

62

zvvq.cn

63 内容来自zvvq,别采集哟

64

zvvq

65 本文来自zvvq

66 zvvq.cn

67

zvvq好,好zvvq

68

zvvq

69 内容来自zvvq,别采集哟

70

内容来自zvvq

71 内容来自zvvq,别采集哟

72

zvvq

func提示Nested(promptLabel string,startingIndex int,items [] promptItem)bool { 内容来自samhan666

// 如果提示不存在,则添加“完成”选项

内容来自samhan666

完成 ID := "完成"

内容来自zvvq

if len(items) &gt; 0 &amp;&amp; items[0].ID != doneID { 内容来自samhan

items =append([]promptItem{{ID:doneID,标签:“完成”}},items...)

zvvq

} zvvq.cn

模板 := &amp;promptui.SelectTemplates{ zvvq.cn

标签:    ”{{ 。 }}?”,

内容来自zvvq

活动:“U0001F336 {{.Label | 青色}}”, zvvq

无效:“{{ .Label | 青色 }}”, zvvq.cn

已选择:“U0001F336 {{ .Label | 红色 | 青色 }}”,

本文来自zvvq

}

zvvq

提示:=提示ui.选择{ zvvq好,好zvvq

标签:提示标签, copyright zvvq

物品: 物品,

内容来自zvvq,别采集哟

模板: 模板,

内容来自samhan666

尺寸: 3,

zvvq

隐藏所选:true,

内容来自zvvq

CursorPos:startingIndex, // 将光标设置到最后一个选定的项目 内容来自samhan666

}

内容来自samhan666

idx, _, err := 提示.Run()

zvvq好,好zvvq

如果错误!= nil {

zvvq好,好zvvq

fmt.Printf("运行时出现错误提示:%vn", err)

zvvq

返回错误 zvvq

} zvvq

所选项目 := 项目[idx]

内容来自samhan

// 如果用户选择“Done”,则返回 true 并退出该函数

内容来自samhan666

if selectedItem.ID == doneID {

内容来自samhan

返回真

zvvq

} zvvq好,好zvvq

var提示响应字符串 本文来自zvvq

// 如果提示类型为Text或Password,则提示用户输入 copyright zvvq

如果 selectedItem.promptType == TextPrompt || selectedItem.promptType == 密码提示 {

copyright zvvq

提示响应,错误=提示输入(所选项目)

copyright zvvq

如果错误!= nil {

zvvq好,好zvvq

fmt.Printf("运行时出现错误提示:%vn", err) copyright zvvq

返回错误 内容来自samhan

} 内容来自samhan666

items[idx].Value = 提示响应

内容来自samhan666

} 本文来自zvvq

// 如果提示类型为 Select,则提示用户从选项列表中进行选择

zvvq

if selectedItem.promptType == SelectPrompt {

copyright zvvq

提示响应,错误=提示选择(所选项目) 本文来自zvvq

如果错误!= nil {

copyright zvvq

fmt.Printf("运行时出现错误提示:%vn", err) 内容来自zvvq

返回错误

本文来自zvvq

}

zvvq.cn

items[idx].Value = 提示响应 zvvq

} zvvq好,好zvvq

如果错误!= nil {

zvvq

fmt.Printf("运行时出现错误提示:%vn", err)

本文来自zvvq

返回错误 zvvq好,好zvvq

} 本文来自zvvq

// 递归调用promptNested函数以允许用户选择另一个选项 内容来自zvvq,别采集哟

返回提示Nested(idx, items) zvvq

} copyright zvvq

现在我们已经拥有了所需的所有方法,我们需要测试它们。在configCmd命令的Run函数中,我们将创建一个promptItem列表并调用promptNested函数来提示用户输入。 Run 函数应该如下所示: zvvq好,好zvvq

1 内容来自zvvq

2

内容来自samhan666

3 内容来自samhan666

4 内容来自zvvq

5

zvvq.cn

6

zvvq

7 内容来自zvvq

8

zvvq.cn

9

zvvq

10 内容来自samhan

11

内容来自zvvq,别采集哟

12 zvvq

13 内容来自samhan

14 内容来自zvvq,别采集哟

15 zvvq好,好zvvq

16

本文来自zvvq

17 本文来自zvvq

18

zvvq好,好zvvq

19

copyright zvvq

20 zvvq

21

内容来自zvvq

22 内容来自samhan

23 copyright zvvq

24

zvvq.cn

25 内容来自zvvq,别采集哟

26

zvvq好,好zvvq

27

copyright zvvq

// 创建提示项列表 内容来自samhan666

项目 := []提示项目{

copyright zvvq

{ copyright zvvq

ID:“API密钥”,

内容来自zvvq,别采集哟

标签:“API 密钥”,

内容来自samhan666

提示类型:密码提示, 本文来自zvvq

},

内容来自samhan666

{

内容来自samhan666

ID:“主题”,

copyright zvvq

标签:“主题”, 内容来自samhan

提示类型:选择提示, 内容来自zvvq

SelectOptions: []string{"深色", "浅色"},

内容来自zvvq,别采集哟

},

zvvq.cn

{ 内容来自zvvq

ID:“语言”,

copyright zvvq

标签:“首选语言”, 内容来自samhan

提示类型:选择提示,

本文来自zvvq

SelectOptions: []string{"英语", "西班牙语", "法语", "德语", "中文", "日语"}, 内容来自samhan

},

内容来自samhan666

}

zvvq.cn

// 将起始索引设置为 0 以从列表中的第一项开始

zvvq

PromptNested("配置项", 0, 项)

内容来自samhan666

for _, v := 范围项 { 内容来自samhan

fmt.Printf("用值 (%s)...n 保存配置 (%s)...n", v.ID, v.Value)

本文来自zvvq

}

zvvq好,好zvvq

按如下方式构建并测试应用程序

本文来自zvvq

1 copyright zvvq

2

内容来自zvvq,别采集哟

$ 去构建。 copyright zvvq

$ ./嵌套提示配置

内容来自zvvq

结果如下

zvvq.cn

以上就是使用promptui 在 Go 中嵌套提示的详细内容,更多请关注其它相关文章! 内容来自zvvq