diff --git a/cmd/rove/main.go b/cmd/rove/main.go index e00fd9f..17d8dd4 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -214,7 +214,7 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := maths.FromString(args[i]); err != nil { + } else if _, err := maths.BearingFromString(args[i]); err != nil { return err } commands = append(commands, diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index 002b06a..e72148b 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -55,8 +55,8 @@ func (d Bearing) ShortString() string { return bearingStrings[d].Short } -// FromString gets the Direction from a string -func FromString(s string) (Bearing, error) { +// BearingFromString gets the Direction from a string +func BearingFromString(s string) (Bearing, error) { for i, d := range bearingStrings { if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { return Bearing(i), nil @@ -80,3 +80,18 @@ var bearingVectors = []Vector{ func (d Bearing) Vector() Vector { return bearingVectors[d] } + +// IsCardinal returns if this is a cardinal (NESW) +func (d Bearing) IsCardinal() bool { + switch d { + case North: + fallthrough + case East: + fallthrough + case South: + fallthrough + case West: + return true + } + return false +} diff --git a/pkg/maths/bearing_test.go b/pkg/maths/bearing_test.go index bb97043..e0de345 100644 --- a/pkg/maths/bearing_test.go +++ b/pkg/maths/bearing_test.go @@ -13,19 +13,19 @@ func TestDirection(t *testing.T) { assert.Equal(t, "N", dir.ShortString()) assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) - dir, err := FromString("N") + dir, err := BearingFromString("N") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("n") + dir, err = BearingFromString("n") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("north") + dir, err = BearingFromString("north") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("NorthWest") + dir, err = BearingFromString("NorthWest") assert.NoError(t, err) assert.Equal(t, NorthWest, dir) } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index b3b15a0..4693555 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -426,8 +426,10 @@ func (w *World) Enqueue(rover string, commands ...Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_move: - if _, err := maths.FromString(c.Bearing); err != nil { + if b, err := maths.BearingFromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) + } else if !b.IsCardinal() { + return fmt.Errorf("bearing must be cardinal") } case roveapi.CommandType_broadcast: if len(c.Message) > 3 { @@ -505,7 +507,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { switch c.Command { case roveapi.CommandType_move: - if dir, err := maths.FromString(c.Bearing); err != nil { + if dir, err := maths.BearingFromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err