package main import ( "bufio" "errors" "fmt" "github.com/rdarius/boot-dev-pokedex/pokeapi" "os" "strings" "time" ) type config struct { pokeapiClient pokeapi.Client nextLocationsURL *string prevLocationsURL *string } type cliCommand struct { name string description string callback func(*config) error } var commands map[string]cliCommand func main() { pokeClient := pokeapi.NewClient(5*time.Second, time.Minute*5) cfg := &config{ pokeapiClient: pokeClient, } commands = map[string]cliCommand{ "exit": { name: "exit", description: "Exit the Pokedex", callback: commandExit, }, "help": { name: "help", description: "Display a help message", callback: printHelpMessage, }, "map": { name: "map", description: "Get the next page of locations", callback: commandMapf, }, "mapb": { name: "mapb", description: "Get the previous page of locations", callback: commandMapb, }, } for { // read user input input := bufio.NewScanner(os.Stdin) fmt.Print("Pokedex > ") for input.Scan() { word := input.Text() cleanedWord := cleanInput(word) command := cleanedWord[0] //check if command is in commands map cmd, ok := commands[command] if ok { err := cmd.callback(cfg) if err != nil { fmt.Println(err) } } else { fmt.Println("Unknown command") } fmt.Print("Pokedex > ") } } } func commandExit(*config) error { fmt.Println("Closing the Pokedex... Goodbye!") os.Exit(0) return nil } func cleanInput(text string) []string { output := strings.ToLower(text) words := strings.Fields(output) return words } func printHelpMessage(*config) error { fmt.Print("Welcome to the Pokedex!\nUsage:\n\n") for _, v := range commands { fmt.Printf("%s: %s\n", v.name, v.description) } return nil } func commandMapf(cfg *config) error { locationsResp, err := cfg.pokeapiClient.ListLocations(cfg.nextLocationsURL) if err != nil { return err } cfg.nextLocationsURL = locationsResp.Next cfg.prevLocationsURL = locationsResp.Previous for _, loc := range locationsResp.Results { fmt.Println(loc.Name) } return nil } func commandMapb(cfg *config) error { if cfg.prevLocationsURL == nil { return errors.New("you're on the first page") } locationResp, err := cfg.pokeapiClient.ListLocations(cfg.prevLocationsURL) if err != nil { return err } cfg.nextLocationsURL = locationResp.Next cfg.prevLocationsURL = locationResp.Previous for _, loc := range locationResp.Results { fmt.Println(loc.Name) } return nil }