week 4 second course

drew/sql-it
Drew Bednar 1 year ago
parent e7fd00ed1e
commit f5d40dfc3a

@ -0,0 +1,151 @@
package main
import (
"bufio"
"errors"
"fmt"
"os"
"strings"
)
type Animal interface {
Eat()
Move()
Speak()
}
type Cow struct {
name string
food string `default:"grass"`
locomotion string `default:"walk"`
sound string `default:"moo"`
}
func (a Cow) Eat() {
fmt.Println(a.food)
}
func (a Cow) Move() {
fmt.Println(a.locomotion)
}
func (a Cow) Speak() {
fmt.Println(a.sound)
}
type Bird struct {
Name string
Food string `default:"worms"`
Locomotion string `default:"fly"`
Sound string `default:"peep"`
}
func (a Bird) Eat() {
fmt.Println(a.Food)
}
func (a Bird) Move() {
fmt.Println(a.Locomotion)
}
func (a Bird) Speak() {
fmt.Println(a.Sound)
}
type Snake struct {
Name string
Food string `default:"mice"`
Locomotion string `default:"slither"`
Sound string `default:"hsss"`
}
func (a Snake) Eat() {
fmt.Println(a.Food)
}
func (a Snake) Move() {
fmt.Println(a.Locomotion)
}
func (a Snake) Speak() {
fmt.Println(a.Sound)
}
func NewAnimal(name string, animalType string) (Animal, error) {
switch animalType {
case "cow":
return Cow{name, "grass", "walk", "moo"}, nil
case "bird":
return Bird{name, "worms", "fly", "peep"}, nil
case "snake":
return Snake{name, "mice", "slither", "hiss"}, nil
default:
return Cow{}, errors.New(fmt.Sprintf("Error! Failed to create animal of type: %s. Options {cow, bird, snake}.", animalType))
}
}
func queryAnimal(animal Animal, query string) {
switch query {
case "eat":
animal.Eat()
case "move":
animal.Move()
case "speak":
animal.Speak()
default:
fmt.Printf("Error! Query parameter: %s invalid. Options: {eat, move, speak}\n", query)
}
}
// Use the empty interface to map string to Any type
// var animalMap map[string]interface{}
var animalMap map[string]Animal
func main() {
animalMap = make(map[string]Animal)
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("\n\nWelcome to your personal animal database. Two commands are available {newanimal, query}\n")
fmt.Println("The \"newanimal\" command takes two parameters (name, animalType) seperated by white space.")
fmt.Println("\"newanimal\" animal types are restricted to {cow, bird, snake}")
fmt.Println("Example: \"newanimal bob cow\"\n")
fmt.Println("The \"query\" command takes two parameters (name, action) seperated by white space.")
fmt.Println("\"query\" actions are restricted to {eat, move, speak}")
fmt.Println("Example: \"query bob eat\"\n")
for {
fmt.Print(">")
scanner.Scan()
input := scanner.Text()
input = strings.TrimSpace(input)
splitInput := strings.Fields(input)
// Ensure user command is proper size
if len(splitInput) != 3 {
fmt.Println("Error! Invalid input parameters. Please try again.")
continue
}
command := splitInput[0]
animalName := splitInput[1]
arg := splitInput[2]
switch command {
case "newanimal":
userAnimal, err := NewAnimal(animalName, arg)
if err != nil {
fmt.Println(err)
continue
}
animalMap[animalName] = userAnimal
case "query":
// check animal is in datastore
val, present := animalMap[animalName]
if present {
queryAnimal(val, arg)
} else {
fmt.Printf("Error! Failed to find animal %s in database\n", animalName)
}
default:
fmt.Println("Error! Unrecognized user command. Options {newanimal, query}")
}
}
}

@ -0,0 +1,105 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func splitUnpack(s string) (string, string, string) {
x := strings.Split(s, " ")
return x[0], x[1], x[2]
}
type Animal interface {
Eat()
Move()
Speak()
}
type Cow struct{}
type Bird struct{}
type Snake struct{}
func (an Snake) Eat() {
fmt.Println("mice")
}
func (an Snake) Move() {
fmt.Println("slither")
}
func (an Snake) Speak() {
fmt.Println("hsss")
}
func (an Bird) Eat() {
fmt.Println("worms")
}
func (an Bird) Move() {
fmt.Println("fly")
}
func (an Bird) Speak() {
fmt.Println("peep")
}
func (an Cow) Eat() {
fmt.Println("grass")
}
func (an Cow) Move() {
fmt.Println("walk")
}
func (an Cow) Speak() {
fmt.Println("moo")
}
func newanimal(i1, i2 string, cages map[string]Animal) {
switch i2 {
case "cow":
cages[i1] = Cow{}
case "snake":
cages[i1] = Snake{}
case "bird":
cages[i1] = Bird{}
}
fmt.Println("Created it!")
}
func query(i1, i2 string, cages map[string]Animal) {
switch i2 {
case "speak":
cages[i1].Speak()
case "move":
cages[i1].Move()
case "eat":
cages[i1].Eat()
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
var commandtype string
var input1 string
var input2 string
animalCages := make(map[string]Animal)
for {
fmt.Println(">")
scanner.Scan()
commandtype, input1, input2 = splitUnpack(scanner.Text())
if commandtype == "newanimal" {
newanimal(input1, input2, animalCages)
} else if commandtype == "query" {
query(input1, input2, animalCages)
}
}
}

@ -0,0 +1,116 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Animal interface {
Eat()
Move()
Speak()
}
type Cow struct {
}
func (cow Cow) Eat() {
fmt.Println("grass")
}
func (cow Cow) Move() {
fmt.Println("walk")
}
func (cow Cow) Speak() {
fmt.Println("moo")
}
type Bird struct {
}
func (bird Bird) Eat() {
fmt.Println("worms")
}
func (bird Bird) Move() {
fmt.Println("fly")
}
func (bird Bird) Speak() {
fmt.Println("peep")
}
type Snake struct {
}
func (snake Snake) Eat() {
fmt.Println("mice")
}
func (snake Snake) Move() {
fmt.Println("slither")
}
func (snake Snake) Speak() {
fmt.Println("hsss")
}
func createNewAnimal(animalName string, animalType string, animalMap map[string]Animal) {
switch animalType {
case "cow":
animalMap[animalName] = Cow{}
case "bird":
animalMap[animalName] = Bird{}
case "snake":
animalMap[animalName] = Snake{}
default:
fmt.Println("Invalid animal type")
return
}
fmt.Println("Created it!")
}
func queryAnimal(animalName string, animalAction string, animalMap map[string]Animal) {
animal, ok := animalMap[animalName]
if !ok {
fmt.Printf("Could not find animal %s\n", animalName)
return
}
switch animalAction {
case "eat":
animal.Eat()
case "move":
animal.Move()
case "speak":
animal.Speak()
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
animalMap := make(map[string]Animal)
for {
fmt.Print(">")
var fields []string
if scanner.Scan() {
fields = strings.Fields(scanner.Text())
if len(fields) != 3 {
fmt.Println("Wrong number of arguments")
continue
}
}
switch fields[0] {
case "newanimal":
createNewAnimal(fields[1], fields[2], animalMap)
case "query":
queryAnimal(fields[1], fields[2], animalMap)
default:
fmt.Println("Invalid command")
}
}
}
Loading…
Cancel
Save