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 \" \"") continue } if len(splitInputs) < 2 { fmt.Println("Error user input contains less values than the expected \" \"") continue } ProcessCommand(splitInputs) } }