package game import ( "fmt" "log" "strconv" "strings" ) type Movement struct { Range int Swimming bool } func INVALID_MOVEMENT() Movement { return Movement{-1, false} } func parseMovement(desc any) Movement { var movementStr string switch typedDesc := desc.(type) { case uint64: return Movement{int(typedDesc), false} case string: movementStr = typedDesc case map[string]any: movementStr = typedDesc["en"].(string) } tokens := strings.Split(movementStr, " ") r, err := strconv.Atoi(tokens[0]) if err != nil { log.Panicf("Invalid movement description %s", movementStr) } swimming := len(tokens) > 1 && tokens[1] == "swimming" return Movement{r, swimming} } func (m Movement) String() string { if m == INVALID_MOVEMENT() { return "invalid movement" } if m.Swimming { return fmt.Sprintf("%d swimming", m.Range) } return fmt.Sprintf("%d", m.Range) }