ZVVQ代理分享网

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

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

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

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

1

2

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

$ 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

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

1

2

3

$ go get -u github.com/spf13/cobra@latest

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

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

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

1

2

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//cmd/config.go

包命令

进口 (

“FMMT”

“github.com/spf13/cobra”

var configCmd = &amp;cobra.Command{

使用:“配置”,

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

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

运行: func(cmd cobra.Command, args []string) {

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

},

}

函数初始化{

rootCmd.AddCommand(configCmd)

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

type PromptType int

常量(

文本提示提示类型 = 0

密码提示提示类型 = 1

选择提示提示类型 = 2

类型提示项目结构{

ID字符串

标签字符串

值字符串

选择选项[]字符串

提示类型 提示类型

}

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

提示:=提示ui.提示{

标签:项目.标签,

隐藏输入:true,

}

if item.promptType == PasswordPrompt {

提示.Mask =

}

res, err := 提示.Run()

如果错误!= nil {

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

返回“”,错误

}

返回资源,无

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

func提示选择(项目选择项目)(字符串,错误){

提示:=提示ui.选择{

标签:项目.标签,

项目:item.SelectValues,

隐藏所选:true,

}

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

如果错误!= nil {

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

返回“”,错误

}

返回结果,无

}

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

func提示Nested(promptLabel string,startingIndex int,items [] promptItem)bool {

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

完成 ID := "完成"

if len(items) &gt; 0 &amp;&amp; items[0].ID != doneID {

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

}

模板 := &amp;promptui.SelectTemplates{

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

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

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

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

}

提示:=提示ui.选择{

标签:提示标签,

物品: 物品,

模板: 模板,

尺寸: 3,

隐藏所选:true,

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

}

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

如果错误!= nil {

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

返回错误

}

所选项目 := 项目[idx]

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

if selectedItem.ID == doneID {

返回真

}

var提示响应字符串

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

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

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

如果错误!= nil {

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

返回错误

}

items[idx].Value = 提示响应

}

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

if selectedItem.promptType == SelectPrompt {

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

如果错误!= nil {

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

返回错误

}

items[idx].Value = 提示响应

}

如果错误!= nil {

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

返回错误

}

// 递归调用promptNested函数以允许用户选择另一个选项

返回提示Nested(idx, items)

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// 创建提示项列表

项目 := []提示项目{

{

ID:“API密钥”,

标签:“API 密钥”,

提示类型:密码提示,

},

{

ID:“主题”,

标签:“主题”,

提示类型:选择提示,

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

},

{

ID:“语言”,

标签:“首选语言”,

提示类型:选择提示,

SelectOptions: []string{"英语", "西班牙语", "法语", "德语", "中文", "日语"},

},

}

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

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

for _, v := 范围项 {

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

}

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

1

2

$ 去构建。

$ ./嵌套提示配置

结果如下

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

    展开全文