如何在方尖碑中正确进行嵌套路由?

时间:2020-04-01 18:07:26

标签: haskell haskell-snap-framework reflex

我去过searching for examples,但是大多数示例都使用RouteSomething -> PathSegment "firstpath" $ unitEncoder mempty而不是单个嵌套路线。

有些示例使用Cat.id将整个URI作为文本传递,例如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.Routeob init中定义,而其他示例仅在此处定义路由。我希望LambdaCase能够通过对路由进行编码的数据类型进行详尽检查,并且不必在所有可能的后端/前端子路由上添加等效的BackendRoute_Missing。

1 个答案:

答案 0 :(得分:4)

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

然后将unitEncoder替换为pathComponentEncoder $ \case ...

另请参见obelisk-oauth