Compare commits

...

3 commits

Author SHA1 Message Date
ab880bbbbb
update documentation 2024-09-23 22:27:24 +01:00
f7359402ef
fix: improve formatting of the help menu
Use text/tabwriter to improve the formatting of the help menu.
2024-09-23 22:26:15 +01:00
23d6ddbdc8
fix: update prompt string plus some refactoring
- Updated the prompt string.
- Move the main package to cmd/pokecli.
- Added a loop function in the main repl function.
2024-09-23 22:05:30 +01:00
7 changed files with 93 additions and 36 deletions

2
.gitignore vendored
View file

@ -1 +1 @@
pokecli
/pokecli

View file

@ -1,3 +1,38 @@
# pokecli
A simple CLI application for exploring the Pokémon world.
## Overview
**pokecli** is a simple CLI application that uses the [PokéAPI](https://pokeapi.co/) for exploring the Pokémon world and capturing Pokémon.
### Repository mirrors
- **Code Flow:** https://codeflow.dananglin.me.uk/apollo/pokecli
- **GitHub:** https://github.com/dananglin/pokecli
## Requirements
- **Go:** A minimum version of Go 1.23.1 is required for building the pokecli. Please go [here](https://go.dev/dl/) to download the latest version.
## Build the application
Clone this repository to your local machine.
```
git clone https://github.com/dananglin/pokecli.git
```
Build the application.
- Build with go.
```
go build -o pokecli .
```
- Or build with [mage](https://magefile.org/) if you have it installed.
```
mage clean build
```
## Usage
TBC

5
cmd/pokecli/main.go Normal file
View file

@ -0,0 +1,5 @@
package main
func main() {
repl()
}

View file

@ -3,7 +3,6 @@ package main
import (
"bufio"
"fmt"
"maps"
"os"
"strings"
"time"
@ -18,11 +17,7 @@ type command struct {
callback commands.CommandFunc
}
func main() {
run()
}
func run() {
func repl() {
var (
cacheCleanupInterval = 30 * time.Minute
httpTimeout = 10 * time.Second
@ -80,52 +75,46 @@ func run() {
callback: commands.HelpFunc(summaries),
}
fmt.Printf("\nWelcome to the Pokedex!\n")
fmt.Print("\npokedex > ")
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
loopFunc := func() {
defer printPrompt()
input := scanner.Text()
command, args := parseArgs(input)
command, args := parseInput(input)
cmd, ok := commandMap[command]
if !ok {
fmt.Println("ERROR: Unrecognised command.")
fmt.Print("\npokedex > ")
continue
return
}
if cmd.callback == nil {
fmt.Println("ERROR: This command is defined but does not have a callback function.")
fmt.Print("\npokedex > ")
continue
return
}
if err := commandMap[command].callback(args); err != nil {
fmt.Printf("ERROR: %v.\n", err)
return
}
}
fmt.Print("pokedex > ")
fmt.Printf("\nWelcome to the Pokemon world!\n")
printPrompt()
for scanner.Scan() {
loopFunc()
}
}
func summaryMap(commandMap map[string]command) map[string]string {
summaries := make(map[string]string)
for key, value := range maps.All(commandMap) {
summaries[key] = value.description
}
return summaries
}
func parseArgs(input string) (string, []string) {
func parseInput(input string) (string, []string) {
input = strings.TrimSpace(input)
input = strings.ToLower(input)
split := strings.Split(input, " ")
if len(split) == 0 {
@ -138,3 +127,7 @@ func parseArgs(input string) (string, []string) {
return split[0], split[1:]
}
func printPrompt() {
fmt.Print("pokecli > ")
}

13
cmd/pokecli/summaries.go Normal file
View file

@ -0,0 +1,13 @@
package main
import "maps"
func summaryMap(commandMap map[string]command) map[string]string {
summaries := make(map[string]string)
for key, value := range maps.All(commandMap) {
summaries[key] = value.description
}
return summaries
}

View file

@ -3,7 +3,10 @@ package commands
import (
"fmt"
"maps"
"os"
"slices"
"strings"
"text/tabwriter"
)
func HelpFunc(summaries map[string]string) CommandFunc {
@ -16,13 +19,21 @@ func HelpFunc(summaries map[string]string) CommandFunc {
slices.Sort(keys)
fmt.Printf("\nCommands:\n")
var builder strings.Builder
builder.WriteString("\nCommands:\n")
tableWriter := tabwriter.NewWriter(&builder, 0, 8, 0, '\t', 0)
for _, key := range slices.All(keys) {
fmt.Printf("\n%s: %s", key, summaries[key])
fmt.Fprintf(tableWriter, "\n%s\t%s", key, summaries[key])
}
fmt.Printf("\n\n")
tableWriter.Flush()
builder.WriteString("\n\n")
fmt.Fprint(os.Stdout, builder.String())
return nil
}

View file

@ -56,7 +56,7 @@ func Lint() error {
// To rebuild packages that are already up-to-date set POKECLI_BUILD_REBUILD_ALL=1
// To enable verbose mode set POKECLI_BUILD_VERBOSE=1
func Build() error {
main := "main.go"
path := "./cmd/" + app
flags := ldflags()
build := sh.RunCmd("go", "build")
args := []string{"-ldflags=" + flags, "-o", binary}
@ -69,7 +69,7 @@ func Build() error {
args = append(args, "-v")
}
args = append(args, main)
args = append(args, path)
return build(args...)
}