首页 > 解决方案 > 如何在 Obelisk 中正确地进行嵌套路由?

问题描述

我一直在搜索示例,但是大多数示例都执行一个RouteSomething -> PathSegment "firstpath" $ unitEncoder mempty而不是单个嵌套路由。

有一些示例用于Cat.id将整个 URI 作为 Text 传递,例如Characher-Sheet

backendRouteEncoder = mkFullRouteEncoder
  (FullRoute_Backend BackendRoute_Missing :/ ())
  (\case
    BackendRoute_API -> PathSegment "api" $ Cat.id
    BackendRoute_Missing -> PathSegment "missing" $ unitEncoder mempty
  )

然后在后端解析整个路由:

server sql (BackendRoute_API :=> Identity _) = dir "api" $
    route [ ("spelllist/", runReaderT spellListHandler sql)
          , ("featlist/", runReaderT featListHandler sql)
          ]

但是,这感觉很奇怪,因为我原以为所有路由都将Common.Route按照Obelisk.Route框架的框架ob init和其他仅在此处定义路由的示例来定义。我希望 LambdaCase 对编码路由的数据类型进行详尽检查的安全性,并且不必在所有可能的后端/前端子路由上添加等效的 BackendRoute_Missing。

标签: haskellhaskell-snap-frameworkreflex

解决方案


data FrontendRoute :: * -> * where
  FrontendRoute_Sub :: FrontendRoute (R SubRoute)
data SubRoute :: * -> * where
  SubRoute_Foo :: SubRoute ()

然后替换unitEncoderpathComponentEncoder $ \case ...

另一个例子参见obelisk-oauth


推荐阅读