You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
Elm
81 lines
1.7 KiB
Elm
module Route exposing (MazeShape(..), Route(..), parse, toAbsolutePath)
|
|
|
|
import Url exposing (Url)
|
|
import Url.Builder as Builder
|
|
import Url.Parser as Parser exposing ((</>), Parser, int, map, oneOf, s, top)
|
|
import Url.Parser.Query as Query
|
|
|
|
|
|
type Route
|
|
= New
|
|
| Maze { shape : MazeShape, seed : Int, width : Int, height : Int }
|
|
| NotFound
|
|
|
|
|
|
type MazeShape
|
|
= Squares
|
|
| Hexes
|
|
|
|
|
|
parse : Url -> Route
|
|
parse =
|
|
Parser.parse parser >> Maybe.withDefault NotFound
|
|
|
|
|
|
parser : Parser (Route -> b) b
|
|
parser =
|
|
oneOf
|
|
[ map
|
|
(\shape width height seed ->
|
|
Maze { shape = shape, seed = seed, width = width, height = height }
|
|
)
|
|
(top </> s "maze" </> mazeShapeParser </> int </> int </> int)
|
|
, map New top
|
|
]
|
|
|
|
|
|
mazeShapeParser : Parser (MazeShape -> b) b
|
|
mazeShapeParser =
|
|
Parser.custom "SHAPE"
|
|
(\segment ->
|
|
case segment of
|
|
"squares" ->
|
|
Just Squares
|
|
|
|
"hexes" ->
|
|
Just Hexes
|
|
|
|
_ ->
|
|
Nothing
|
|
)
|
|
|
|
|
|
toAbsolutePath : Route -> String
|
|
toAbsolutePath route =
|
|
case route of
|
|
New ->
|
|
Builder.absolute [] []
|
|
|
|
Maze { shape, seed, width, height } ->
|
|
Builder.absolute
|
|
[ "maze"
|
|
, shapeToSegment shape
|
|
, String.fromInt width
|
|
, String.fromInt height
|
|
, String.fromInt seed
|
|
]
|
|
[]
|
|
|
|
NotFound ->
|
|
Builder.absolute [ "404" ] []
|
|
|
|
|
|
shapeToSegment : MazeShape -> String
|
|
shapeToSegment shape =
|
|
case shape of
|
|
Squares ->
|
|
"squares"
|
|
|
|
Hexes ->
|
|
"hexes"
|