@@ -91,6 +91,7 @@ module Obelisk.Route
9191 , dmapEncoder
9292 , fieldMapEncoder
9393 , jsonEncoder
94+ , byteStringsToPageName
9495 ) where
9596
9697import Prelude hiding ((.), id)
@@ -103,6 +104,7 @@ import Control.Category.Associative
103104import Control.Category.Monoidal
104105import Control.Lens (Identity (..), Prism', makePrisms, itraverse, imap, prism, (^.), re, matching, (^?), _Just, _Nothing, Iso', from, view, Wrapped (..))
105106import Control.Monad.Except
107+import qualified Data.ByteString as BS
106108import qualified Data.ByteString.Lazy as BSL
107109import Data.Dependent.Sum (DSum (..))
108110import Data.Dependent.Map (DMap)
@@ -953,4 +955,14 @@ jsonEncoder = unsafeEncoder $ do
953955 Right x -> return x
954956 }
955957
958+-- Useful for app server integration.
959+-- p must not start with slashes
960+byteStringsToPageName :: BS.ByteString -> BS.ByteString -> PageName
961+byteStringsToPageName p q =
962+ let pageNameEncoder' :: Encoder Identity Identity PageName (String, String)
963+ pageNameEncoder' = bimap
964+ (unpackTextEncoder . pathSegmentsTextEncoder . listToNonEmptyEncoder)
965+ (unpackTextEncoder . queryParametersTextEncoder . toListMapEncoder)
966+ in decode pageNameEncoder' (T.unpack (decodeUtf8 p), T.unpack (decodeUtf8 q))
967+
956968--TODO: decodeURIComponent as appropriate