README
¶
Survey
A library for building interactive prompts. Heavily inspired by the great inquirer.js.
package main
import (
"fmt"
"gopkg.in/AlecAivazis/survey.v1"
)
// the questions to ask
var qs = []*survey.Question{
{
Name: "name",
Prompt: &survey.Input{Message: "What is your name?"},
Validate: survey.Required,
},
{
Name: "color",
Prompt: &survey.Select{
Message: "Choose a color:",
Options: []string{"red", "blue", "green"},
Default: "red",
},
},
{
Name: "age",
Prompt: &survey.Input{Message: "How old are you?"},
},
}
func main() {
// the answers will be written to this struct
answers := struct {
Name string // survey will match the question and field names
FavoriteColor string `survey:"color"` // or you can tag fields to match a specific name
Age int // if the types don't match exactly, survey will try to convert for you
}{}
// perform the questions
err := survey.Ask(qs, &answers)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%s chose %s.", answers.Name, answers.FavoriteColor)
}
Table of Contents
Examples
Examples can be found in the examples/
directory. Run them
to see basic behavior:
go get gopkg.in/AlecAivazis/survey.v1
# ... navigate to the repo in your GOPATH
go run examples/simple.go
go run examples/validation.go
Prompts
Input

name := ""
prompt := &survey.Input{
Message: "ping",
}
survey.AskOne(prompt, &name, nil)
Password

password := ""
prompt := &survey.Password{
Message: "Please type your password",
}
survey.AskOne(prompt, &password, nil)
Confirm

name := false
prompt := &survey.Confirm{
Message: "Do you like pie?",
}
survey.AskOne(prompt, &name, nil)
Select

color := ""
prompt := &survey.Select{
Message: "Choose a color:",
Options: []string{"red", "blue", "green"},
}
survey.AskOne(prompt, &color, nil)
By default, the select prompt is limited to showing 7 options at a time
and will paginate lists of options longer than that. To increase, you can either
change the global survey.PageCount
, or set the PageSize
field on the prompt:
prompt := &survey.Select{..., PageSize: 10}
MultiSelect

days := []string{}
prompt := &survey.MultiSelect{
Message: "What days do you prefer:",
Options: []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"},
}
survey.AskOne(prompt, &days, nil)
By default, the MultiSelect prompt is limited to showing 7 options at a time
and will paginate lists of options longer than that. To increase, you can either
change the global survey.PageCount
, or set the PageSize
field on the prompt:
prompt := &survey.MultiSelect{..., PageSize: 10}
Editor
Launches the user's preferred editor (defined by the $EDITOR environment variable) on a temporary file. Once the user exits their editor, the contents of the temporary file are read in as the result. If neither of those are present, notepad (on Windows) or vim (Linux or Mac) is used.
Validation
Validating individual responses for a particular question can be done by defining a
Validate
field on the survey.Question
to be validated. This function takes an
interface{}
type and returns an error to show to the user, prompting them for another
response:
q := &survey.Question{
Prompt: &survey.Input{Message: "Hello world validation"},
Validate: func (val interface{}) error {
// since we are validating an Input, the assertion will always succeed
if str, ok := val.(string) ; ok && len(str) > 10 {
return errors.New("This response cannot be longer than 10 characters.")
}
}
}
Built-in Validators
survey
comes prepackaged with a few validators to fit common situations. Currently these
validators include:
name | valid types | description |
---|---|---|
Required | any | Rejects zero values of the response type |
MinLength(n) | string | Enforces that a response is at least the given length |
MaxLength(n) | string | Enforces that a response is no longer than the given length |
Help Text
All of the prompts have a Help
field which can be defined to provide more information to your users:

&survey.Input{
Message: "What is your phone number:",
Help: "Phone number should include the area code",
}
Changing the input rune
In some situations, ?
is a perfectly valid response. To handle this, you can change the rune that survey
looks for by setting the HelpInputRune
variable in survey/core
:
import (
"gopkg.in/AlecAivazis/survey.v1"
surveyCore "gopkg.in/AlecAivazis/survey.v1/core"
)
number := ""
prompt := &survey.Input{
Message: "If you have this need, please give me a reasonable message.",
Help: "I couldn't come up with one.",
}
surveyCore.HelpInputRune = '^'
survey.AskOne(prompt, &number, nil)
Custom Types
survey will assign prompt answers to your custom types if they implement this interface:
type settable interface {
WriteAnswer(field string, value interface{}) error
}
Here is an example how to use them:
type MyValue struct {
value string
}
func (my *MyValue) WriteAnswer(name string, value interface{}) error {
my.value = value.(string)
}
myval := MyValue{}
survey.AskOne(
&survey.Input{
Message: "Enter something:",
},
&myval,
nil,
)
Customizing Output
Customizing the icons and various parts of survey can easily be done by setting the following variables
in survey/core
:
name | default | description |
---|---|---|
ErrorIcon | ✘ | Before an error |
HelpIcon | ⓘ | Before help text |
QuestionIcon | ? | Before the message of a prompt |
SelectFocusIcon | ❯ | Marks the current focus in Select and MultiSelect prompts |
MarkedOptionIcon | ◉ | Marks a chosen selection in a MultiSelect prompt |
UnmarkedOptionIcon | ◯ | Marks an unselected option in a MultiSelect prompt |
Versioning
This project tries to maintain semantic GitHub releases as closely as possible. And relies on gopkg.in to maintain those releasees. Importing v1 of survey could look something like
package main
import "gopkg.in/AlecAivazis/survey.v1"
Documentation
¶
Index ¶
- Variables
- func Ask(qs []*Question, response interface{}) error
- func AskOne(p Prompt, response interface{}, v Validator) error
- func Required(val interface{}) error
- type Confirm
- type ConfirmTemplateData
- type Editor
- type EditorTemplateData
- type Input
- type InputTemplateData
- type MultiSelect
- type MultiSelectTemplateData
- type Password
- type PasswordTemplateData
- type Prompt
- type Question
- type Select
- type SelectTemplateData
- type Validator
Constants ¶
This section is empty.
Variables ¶
var ConfirmQuestionTemplate = `` /* 497-byte string literal not displayed */
Templates with Color formatting. See Documentation: https://github.com/mgutz/ansi#style-format
var EditorQuestionTemplate = `` /* 559-byte string literal not displayed */
Templates with Color formatting. See Documentation: https://github.com/mgutz/ansi#style-format
var InputQuestionTemplate = `` /* 496-byte string literal not displayed */
Templates with Color formatting. See Documentation: https://github.com/mgutz/ansi#style-format
var MultiSelectQuestionTemplate = `` /* 787-byte string literal not displayed */
var PageSize = 7
PageSize is the default maximum number of items to show in select/multiselect prompts
var PasswordQuestionTemplate = `` /* 318-byte string literal not displayed */
Templates with Color formatting. See Documentation: https://github.com/mgutz/ansi#style-format
var SelectQuestionTemplate = `` /* 647-byte string literal not displayed */
Functions ¶
func Ask ¶
Ask performs the prompt loop, asking for validation when appropriate. The response type can be one of two options. If a struct is passed, the answer will be written to the field whose name matches the Name field on the corresponding question. Field types should be something that can be casted from the response type designated in the documentation. Note, a survey tag can also be used to identify a Otherwise, a map[string]interface{} can be passed, responses will be written to the key with the matching name. For example:
qs := []*survey.Question{ { Name: "name", Prompt: &survey.Input{Message: "What is your name?"}, Validate: survey.Required, }, } answers := struct{ Name string }{} err := survey.Ask(qs, &answers)
func AskOne ¶
AskOne performs the prompt for a single prompt and asks for validation if required. Response types should be something that can be casted from the response type designated in the documentation. For example:
name := "" prompt := &survey.Input{ Message: "name", } survey.AskOne(prompt, &name, nil)
Types ¶
type Confirm ¶
Confirm is a regular text input that accept yes/no answers. Response type is a bool.
type ConfirmTemplateData ¶
data available to the templates when processing
type Editor ¶ added in v1.3.0
Editor launches an instance of the users preferred editor on a temporary file. The editor to use is determined by reading the $VISUAL or $EDITOR environment variables. If neither of those are present, notepad (on Windows) or vim (others) is used. The launch of the editor is triggered by the enter key. Since the response may be long, it will not be echoed as Input does, instead, it print <Received>. Response type is a string.
message := "" prompt := &survey.Editor{ Message: "What is your commit message?" } survey.AskOne(prompt, &message, nil)
type EditorTemplateData ¶ added in v1.3.0
data available to the templates when processing
type Input ¶
Input is a regular text input that prints each character the user types on the screen and accepts the input with the enter key. Response type is a string.
name := "" prompt := &survey.Input{ Message: "What is your name?" } survey.AskOne(prompt, &name, nil)
type InputTemplateData ¶
data available to the templates when processing
type MultiSelect ¶ added in v1.0.1
type MultiSelect struct { core.Renderer Message string Options []string Default []string Help string PageSize int // contains filtered or unexported fields }
MultiSelect is a prompt that presents a list of various options to the user for them to select using the arrow keys and enter. Response type is a slice of strings.
days := []string{} prompt := &survey.MultiSelect{ Message: "What days do you prefer:", Options: []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}, } survey.AskOne(prompt, &days, nil)
func (*MultiSelect) Cleanup ¶ added in v1.0.1
func (m *MultiSelect) Cleanup(val interface{}) error
Cleanup removes the options section, and renders the ask like a normal question.
func (*MultiSelect) OnChange ¶ added in v1.0.1
func (m *MultiSelect) OnChange(line []rune, pos int, key rune) (newLine []rune, newPos int, ok bool)
OnChange is called on every keypress.
func (*MultiSelect) Prompt ¶ added in v1.0.1
func (m *MultiSelect) Prompt() (interface{}, error)
type MultiSelectTemplateData ¶ added in v1.0.1
type MultiSelectTemplateData struct { MultiSelect Answer string ShowAnswer bool Checked map[string]bool SelectedIndex int ShowHelp bool PageEntries []string }
data available to the templates when processing
type Password ¶
Password is like a normal Input but the text shows up as *'s and there is no default. Response type is a string.
password := "" prompt := &survey.Password{ Message: "Please type your password" } survey.AskOne(prompt, &password, nil)
type PasswordTemplateData ¶ added in v1.1.1
type Prompt ¶
type Prompt interface { Prompt() (interface{}, error) Cleanup(interface{}) error Error(error) error }
Prompt is the primary interface for the objects that can take user input and return a response.
type Select ¶ added in v1.0.1
type Select struct { core.Renderer Message string Options []string Default string Help string PageSize int // contains filtered or unexported fields }
Select is a prompt that presents a list of various options to the user for them to select using the arrow keys and enter. Response type is a string.
color := "" prompt := &survey.Select{ Message: "Choose a color:", Options: []string{"red", "blue", "green"}, } survey.AskOne(prompt, &color, nil)
type SelectTemplateData ¶
type SelectTemplateData struct { Select PageEntries []string SelectedIndex int Answer string ShowAnswer bool ShowHelp bool }
the data available to the templates when processing
type Validator ¶
type Validator func(interface{}) error
Validator is a function passed to a Question after a user has provided a response. If the function returns an error, then the user will be prompted again for another response.
func ComposeValidators ¶
ComposeValidators is a variadic function used to create one validator from many.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
autoplay
////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/ask.go go run ask.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/confirm.go go run confirm.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/doubleSelect.go go run doubleSelect.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/help.go go run help.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/input.go go run input.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/multiselect.go go run multiselect.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/password.go go run password.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/select.go go run select.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/selectThenInput.go go run selectThenInput.go //////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/ask.go go run ask.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/confirm.go go run confirm.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/doubleSelect.go go run doubleSelect.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/help.go go run help.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/input.go go run input.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/multiselect.go go run multiselect.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/password.go go run password.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/select.go go run select.go ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// DO NOT MODIFY THIS FILE! This file was automatically generated via the commands: go get github.com/coryb/autoplay autoplay -n autoplay/selectThenInput.go go run selectThenInput.go ////////////////////////////////////////////////////////////////////////////// |