Merge remote-tracking branch 'origin/master' into glyphs

This commit is contained in:
Marc Di Luzio 2020-07-19 12:38:46 +01:00
commit 3796ee09a3
4 changed files with 26 additions and 9 deletions

View file

@ -214,7 +214,7 @@ func InnerMain(command string, args ...string) error {
i++ i++
if len(args) == i { if len(args) == i {
return fmt.Errorf("move command must be passed bearing") 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 return err
} }
commands = append(commands, commands = append(commands,

View file

@ -55,8 +55,8 @@ func (d Bearing) ShortString() string {
return bearingStrings[d].Short return bearingStrings[d].Short
} }
// FromString gets the Direction from a string // BearingFromString gets the Direction from a string
func FromString(s string) (Bearing, error) { func BearingFromString(s string) (Bearing, error) {
for i, d := range bearingStrings { for i, d := range bearingStrings {
if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) {
return Bearing(i), nil return Bearing(i), nil
@ -80,3 +80,18 @@ var bearingVectors = []Vector{
func (d Bearing) Vector() Vector { func (d Bearing) Vector() Vector {
return bearingVectors[d] 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
}

View file

@ -13,19 +13,19 @@ func TestDirection(t *testing.T) {
assert.Equal(t, "N", dir.ShortString()) assert.Equal(t, "N", dir.ShortString())
assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector())
dir, err := FromString("N") dir, err := BearingFromString("N")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, North, dir) assert.Equal(t, North, dir)
dir, err = FromString("n") dir, err = BearingFromString("n")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, North, dir) assert.Equal(t, North, dir)
dir, err = FromString("north") dir, err = BearingFromString("north")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, North, dir) assert.Equal(t, North, dir)
dir, err = FromString("NorthWest") dir, err = BearingFromString("NorthWest")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, NorthWest, dir) assert.Equal(t, NorthWest, dir)
} }

View file

@ -426,8 +426,10 @@ func (w *World) Enqueue(rover string, commands ...Command) error {
for _, c := range commands { for _, c := range commands {
switch c.Command { switch c.Command {
case roveapi.CommandType_move: 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) return fmt.Errorf("unknown bearing: %s", c.Bearing)
} else if !b.IsCardinal() {
return fmt.Errorf("bearing must be cardinal")
} }
case roveapi.CommandType_broadcast: case roveapi.CommandType_broadcast:
if len(c.Message) > 3 { if len(c.Message) > 3 {
@ -505,7 +507,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) {
switch c.Command { switch c.Command {
case roveapi.CommandType_move: case roveapi.CommandType_move:
if dir, err := maths.FromString(c.Bearing); err != nil { if dir, err := maths.BearingFromString(c.Bearing); err != nil {
return err return err
} else if _, err := w.MoveRover(rover, dir); err != nil { } else if _, err := w.MoveRover(rover, dir); err != nil {
return err return err