on master help sign in
add a couple of convenience combitaors for routes
commitb38bbda736ad968bd99eefcad80d0dc68238da6b authorDan Bornside <dan.bornside@obsidian.systems> dateTue 19 Feb 2019, 12:41 (8 years ago) parent8968e13
1 file changed+20
lib/route/src/Obelisk/Route.hs+20
lib/route/src/Obelisk/Route.hs+20
@@ -83,6 +83,9 @@ module Obelisk.Route
8383 , renderObeliskRoute
8484 , renderBackendRoute
8585 , renderFrontendRoute
86+ , readShowEncoder
87+ , integralEncoder
88+ , pathSegmentEncoder
8689 ) where
8790
8891import Prelude hiding ((.), id)
@@ -119,6 +122,7 @@ import qualified Data.Text as T
119122import Data.Text.Encoding
120123import Data.Universe
121124import Network.HTTP.Types.URI
125+import qualified Numeric.Lens
122126import Obelisk.Route.TH
123127import Text.Read (readMaybe)
124128
@@ -860,4 +864,20 @@ renderObeliskRoute e r =
860864 enc = (pageNameEncoder . hoistParse (pure . runIdentity) e)
861865 in (T.pack . uncurry (<>)) $ encode enc r
862866
867+readShowEncoder :: (MonadError Text parse, Read a, Show a, Applicative check) => Encoder check parse a PageName
868+readShowEncoder = singlePathSegmentEncoder . unsafeTshowEncoder
869+
870+
871+integralEncoder :: (MonadError Text parse, Applicative check, Integral a) => Encoder check parse a Integer
872+integralEncoder = prismEncoder (Numeric.Lens.integral)
873+
874+pathSegmentEncoder :: (MonadError Text parse, Applicative check) =>
875+ Encoder check parse (Text, PageName) PageName
876+pathSegmentEncoder = unsafeMkEncoder EncoderImpl
877+ { _encoderImpl_encode = \(x, (y, z)) -> (x:y, z)
878+ , _encoderImpl_decode = \(xss, y) -> case xss of
879+ [] -> throwError "not enough path segments"
880+ (x:xs) -> pure (x, (xs, y))
881+ }
882+
863883--TODO: decodeURIComponent as appropriate