Product
Introducing License Enforcement in Socket
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
gopkg.in/dixonwille/wmenu.v2
Package wmenu creates menus for cli programs. It uses wlog for it's interface with the command line. It uses os.Stdin, os.Stdout, and os.Stderr with concurrency by default. wmenu allows you to change the color of the different parts of the menu. This package also creates it's own error structure so you can type assert if you need to. wmenu will validate all responses before calling any function. It will also figure out which function should be called so you don't have to.
This allows me to version this package easier and makes sure everyone has a stable release that they want to use.
import "gopkg.in/dixonwille/wmenu.v1"
import "gopkg.in/dixonwille/wmenu.v2"
This is a simple use of the package. (NOTE: THIS IS A V2 SAMPLE)
menu := wmenu.NewMenu("What is your favorite food?")
menu.Action(func (opt Opt) error {fmt.Printf(opt.Text + " is your favorite food."); return nil})
menu.Option("Pizza", nil, true, nil)
menu.Option("Ice Cream", nil, false, nil)
menu.Option("Tacos", nil, false, func() error {
fmt.Printf("Tacos are great")
})
err := menu.Run()
if err != nil{
log.Fatal(err)
}
The output would look like this:
0) *Pizza
1) Ice Cream
2) Tacos
What is your favorite food?
If the user just presses [Enter]
then the option(s) with the *
will be selected. This indicates that it is a default function. If they choose 1
then they would see Ice Cream is your favorite food.
. This used the Action's function because the option selected didn't have a function along with it. But if they choose 2
they would see Tacos are great
. That option did have a function with it which take precedence over Action.
You can you also use:
menu.MultipleAction(func (opt []Opt) error {return nil})
This will allow the user to select multiple options. The default delimiter is a [space]
, but can be changed by using:
menu.SetSeperator("some string")
Another feature is the ability to ask yes or no questions.
menu.IsYesNo(0)
This will remove any options previously added options and hide the ones used for the menu. It will simply just ask yes or no. Menu will parse and validate the response for you. This option will always call the Action's function and pass in the option that was selected.
Allows the user to pass anything for the value so it can be retrieved later in the function. The following is to show case the power of this.
type NameEntity struct {
FirstName string
LastName string
}
optFunc := func() error {
fmt.Println("Option 0 was chosen.")
return nil
}
actFunc := func(opt Opt) error {
name, ok := opt.Value.(NameEntity)
if !ok {
log.Fatal("Could not cast option's value to NameEntity")
}
fmt.Printf("%s has an id of %d.\n", opt.Text, opt.ID)
fmt.Printf("Hello, %s %s.\n", name.FirstName, name.LastName)
return nil
}
menu := NewMenu("Choose an option.")
menu.ChangeReaderWriter(reader, os.Stdout, os.Stderr)
menu.Action(actFunc)
menu.Option("Option 0", NameEntity{"Bill", "Bob"}, true, optFunc)
menu.Option("Option 1", NameEntity{"John", "Doe"}, false, nil)
menu.Option("Option 2", NameEntity{"Jane", "Doe"}, false, nil)
err := menu.Run()
if err != nil {
log.Fatal(err)
}
The immediate output would be:
Output:
0) *Option 0
1) Option 1
2) Option 2
Choose an option.
Now if the user pushes [ENTER]
the output would be Options 0 was chosen.
. But now if either option 1 or 2 were chosen it would cast the options value to a NameEntity allowing the function to be able to gather both the first name and last name of the NameEntity. If you want though you can just pass in nil
as the value or even a string ("hello"
) since both of these implement the empty interface required by value. Just make sure to cast the values so you can use them appropriately.
This whole package has been documented and has a few examples in:
You should read the docs to find all functions and structures at your finger tips.
FAQs
Unknown package
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Ensure open-source compliance with Socket’s License Enforcement Beta. Set up your License Policy and secure your software!
Product
We're launching a new set of license analysis and compliance features for analyzing, managing, and complying with licenses across a range of supported languages and ecosystems.
Product
We're excited to introduce Socket Optimize, a powerful CLI command to secure open source dependencies with tested, optimized package overrides.