on master help sign in
Merge pull request #357 from obsidiansystems/db-more-routes-combinators

Db more routes combinators

commitee38256df4bbbbfc9ba4f3fa1c63d6836b824fe2 authorAli Abrar <aliabrar@gmail.com> dateSat 2 Mar 2019, 22:22 (8 years ago) parent1eeff45b38bbda
3 files changed+24−3
lib/route/obelisk-route.cabal+1 lib/route/src/Obelisk/Route.hs+21 lib/route/src/Obelisk/Route/TH.hs+2−3
lib/route/obelisk-route.cabal+1
@@ -8,6 +8,7 @@ library
88 build-depends: base,
99 categories,
1010 constraints,
11+ constraints-extras,
1112 containers,
1213 dependent-map,
1314 dependent-sum,
lib/route/src/Obelisk/Route.hs+21
@@ -10,6 +10,7 @@
1010{-# LANGUAGE MultiParamTypeClasses #-}
1111{-# LANGUAGE OverloadedStrings #-}
1212{-# LANGUAGE PatternSynonyms #-}
13+{-# LANGUAGE PolyKinds #-}
1314{-# LANGUAGE RankNTypes #-}
1415{-# LANGUAGE ScopedTypeVariables #-}
1516{-# LANGUAGE TemplateHaskell #-}
@@ -82,6 +83,9 @@ module Obelisk.Route
8283 , renderObeliskRoute
8384 , renderBackendRoute
8485 , renderFrontendRoute
86+ , readShowEncoder
87+ , integralEncoder
88+ , pathSegmentEncoder
8589 ) where
8690
8791import Prelude hiding ((.), id)
@@ -118,6 +122,7 @@ import qualified Data.Text as T
118122import Data.Text.Encoding
119123import Data.Universe
120124import Network.HTTP.Types.URI
125+import qualified Numeric.Lens
121126import Obelisk.Route.TH
122127import Text.Read (readMaybe)
123128
@@ -859,4 +864,20 @@ renderObeliskRoute e r =
859864 enc = (pageNameEncoder . hoistParse (pure . runIdentity) e)
860865 in (T.pack . uncurry (<>)) $ encode enc r
861866
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+
862883--TODO: decodeURIComponent as appropriate
lib/route/src/Obelisk/Route/TH.hs+2−3
@@ -1,5 +1,6 @@
11module Obelisk.Route.TH (deriveRouteComponent) where
22
3+import Data.Constraint.Extras.TH
34import Data.GADT.Show.TH
45import Data.GADT.Compare.TH
56import Data.Universe.TH
@@ -11,8 +12,6 @@ deriveRouteComponent x = concat <$> traverse ($ x)
1112 [ deriveGShow
1213 , deriveGEq
1314 , deriveGCompare
14− , deriveShowTagIdentity
15− , deriveEqTagIdentity
16− , deriveOrdTagIdentity
1715 , deriveSomeUniverse
16+ , deriveArgDict
1817 ]