noredink-ui/styleguide-app/Routes.elm
2022-03-15 18:06:13 +00:00

61 lines
1.2 KiB
Elm

module Routes exposing (Route(..), fromLocation, toString)
import Category
import Parser exposing ((|.), (|=), Parser)
import Url exposing (Url)
type Route
= Doodad String
| Category Category.Category
| All
toString : Route -> String
toString route_ =
case route_ of
Doodad exampleName ->
"#/doodad/" ++ exampleName
Category c ->
"#/category/" ++ Debug.toString c
All ->
"#/"
route : Parser Route
route =
Parser.oneOf
[ Parser.succeed Category
|. Parser.token "/category/"
|= (restOfPath |> Parser.andThen category)
, Parser.succeed Doodad
|. Parser.token "/doodad/"
|= restOfPath
, Parser.succeed All
]
restOfPath : Parser String
restOfPath =
Parser.getChompedString (Parser.chompWhile (always True))
category : String -> Parser Category.Category
category string =
case Category.fromString string of
Ok c ->
Parser.succeed c
Err e ->
Parser.problem e
fromLocation : Url -> Route
fromLocation location =
location.fragment
|> Maybe.withDefault ""
|> Parser.run route
|> Result.withDefault All