@@ -91,6 +91,7 @@ module Obelisk.Route
91 , dmapEncoder
91 , dmapEncoder
92 , fieldMapEncoder
92 , fieldMapEncoder
93 , jsonEncoder
93 , jsonEncoder
94+ , byteStringsToPageName
96import Prelude hiding ((.), id)
97import Prelude hiding ((.), id)
@@ -103,6 +104,7 @@ import Control.Category.Associative
103import Control.Category.Monoidal
104import Control.Category.Monoidal
104import Control.Lens (Identity (..), Prism', makePrisms, itraverse, imap, prism, (^.), re, matching, (^?), _Just, _Nothing, Iso', from, view, Wrapped (..))
105import Control.Lens (Identity (..), Prism', makePrisms, itraverse, imap, prism, (^.), re, matching, (^?), _Just, _Nothing, Iso', from, view, Wrapped (..))
105import Control.Monad.Except
106import Control.Monad.Except
107+import qualified Data.ByteString as BS
106import qualified Data.ByteString.Lazy as BSL
108import qualified Data.ByteString.Lazy as BSL
107import Data.Dependent.Sum (DSum (..))
109import Data.Dependent.Sum (DSum (..))
108import Data.Dependent.Map (DMap)
110import Data.Dependent.Map (DMap)
@@ -953,4 +955,14 @@ jsonEncoder = unsafeEncoder $ do
953 Right x -> return x
955 Right x -> return x
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))
956--TODO: decodeURIComponent as appropriate
968--TODO: decodeURIComponent as appropriate