# MenuGenie
Rust library for managing multi-level terminal menus. It provides simple builder API for creating nested menus.
## Usage
A simple example application [simple.rs](./examples/simple.rs)
### Menu actions
There are several menu actions that can execute when user selects a menu item
- Back - Goes back to the previous menu
- BackToStart - Goes back to the firts menu
- Quit - Quits the menu
- Navigate - Navigates to the menu with provided id
- Nothing - Used when we actualy want to execute some other code.
When the menu encounters the Nothing action it will return with `Ok(Some((menu_id, menu_item_id)))` so we can match against the returned touple. See the [simple.rs](./examples/simple.rs) example.
### Builder
Builder starts of with empty vector of menus.
When we call `with_menu(id)` we insert another menu with the provided id.
`with_menu_item(prompt, action)` adds a generic menu item with the provided message and action. Each menu item has an id that is auto-generated when menu item is added to the menu. That menu item id is used when user makes a selection. **Menu items are added to the last added menu so menu must exist before we add any menu items.**
`with_back_button()` adds a menu item with text "Back", action Back and id 0.
`with_quit_button()` adds a menu item with text "Quit", action Quit and id 0.
> **_Note_** If you want a back and a quit button at the same time you can add one with provided "shortcut" function and other with `with_menu_item` function.
Starting menu id is set when first menu is added but it can be modified with `with_starting_menu` function.
Finally to get a `MenuGenie` instance simply call `build`.
### MenuGenie struct
MenuGenie struct holds the menus and the starting menu id. It works by saving a callstack of menu ids.
It has two functions for running the menu:
- `prompt` Function reads the last menu id from the callstack and prompts the user. Maybe we started a menu and an error happend, we can continue from the last menu that was displayed just by calling `prompt` again.
- `restart` Function first clears the callstack and puts starting menu id back on it, then calls `prompt`. It's useful if we want to start the menu from the beginning again.
> **_Note_** when we call `build` on `MenuBuilder` it places starting menu id onto the callstack so we can just call run.
## Future
It the future I plan on adding more features and customizations to the library. If you have some ideas fell free to let me know.
These are some ideas that came to my mind:
- [ ] Configuration for setting the default quit and back button texts, Callbacks for automatically handling input and parsing errors, etc.
- [ ] Dynamic menu item that is controlled by some condition. For example we want to display some menu item if user is logged in or not.
## Contributions
Contributions and suggestions are always welcome. Fell free to participate in this project.