You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
1.8 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strings"
)
// shorter declaration option
// type Animal struct {
// food, locomotion, sound string
// }
type Animal struct {
food string
locomotion string
noise string
}
var cow Animal = Animal{"grass", "walk", "moo"}
var bird Animal = Animal{"worms", "fly", "peep"}
var snake Animal = Animal{"mice", "slither", "hiss"}
func (a Animal) Eat() {
fmt.Println(a.food)
}
func (a Animal) Move() {
fmt.Println(a.locomotion)
}
func (a Animal) Speak() {
fmt.Println(a.noise)
}
func ParseUserInput(s string) []string {
noNewLine := strings.Trim(s, "\n")
return strings.Split(noNewLine, " ")
}
func ProcessCommand(cmd []string) {
switch cmd[0] {
case "cow":
PerformAction(cow, cmd[1])
case "bird":
PerformAction(bird, cmd[1])
case "snake":
PerformAction(snake, cmd[1])
default:
fmt.Println("Invalid animal. Options {cow, bird, snake}")
}
}
func PerformAction(v Animal, action string) {
switch action {
case "eat":
v.Eat()
case "move":
v.Move()
case "speak":
v.Speak()
default:
fmt.Println("Invalid action. Options: {eat, move, speak}")
}
}
func main() {
fmt.Println("Welcome to Animal Farm! We have a \"cow\", \"bird\", and \"snake\".")
fmt.Println("You can ask eat animal to \"eat\", \"move\", or \"speak\".")
fmt.Println("Example: >cow move")
inputReader := bufio.NewReader(os.Stdin)
for {
fmt.Printf(">")
userInput, _ := inputReader.ReadString('\n')
splitInputs := ParseUserInput(userInput)
if len(splitInputs) > 2 {
fmt.Println("Error user input contains more values than the expected \"<animal> <action>\"")
continue
}
if len(splitInputs) < 2 {
fmt.Println("Error user input contains less values than the expected \"<animal> <action>\"")
continue
}
ProcessCommand(splitInputs)
}
}