@@ -79,6 +79,8 @@ module Obelisk.Route
7979 , void1Encoder
8080 , pathSegmentsTextEncoder
8181 , queryParametersTextEncoder
82+ , renderBackendRoute
83+ , unsafeRenderBackendRoute
8284 ) where
8385
8486import Prelude hiding ((.), id)
@@ -828,4 +830,27 @@ makePrisms ''ObeliskRoute
828830deriveGEq ''Void1
829831deriveGCompare ''Void1
830832
833+-- | Given a backend route and the standard backend route encoder,
834+-- render the route (path and query string).
835+renderBackendRoute
836+ :: forall br a.
837+ Encoder Identity Identity (R (Sum br a)) PageName
838+ -> R br
839+ -> Text
840+renderBackendRoute backendRouteEncoder r =
841+ let enc :: Encoder Identity (Either Text) (R (Sum br a)) PathQuery
842+ enc = (pageNameEncoder . hoistParse (pure . runIdentity) backendRouteEncoder)
843+ in (T.pack . uncurry (<>)) . encode enc . hoistR InL $ r
844+
845+-- | Renders a backend route and assumes that the supplied encoder is valid.
846+-- If you have a valid (i.e., checked) encoder, you can use 'renderBackendRoute'
847+-- instead. See 'checkEncoder' for more information.
848+unsafeRenderBackendRoute
849+ :: Encoder (Either Text) Identity (R (Sum br a)) PageName
850+ -> R br
851+ -> Text
852+unsafeRenderBackendRoute backendRouteEncoder =
853+ let Right enc = checkEncoder backendRouteEncoder
854+ in renderBackendRoute enc
855+
831856--TODO: decodeURIComponent as appropriate