如何在方尖碑中正确进行嵌套路由?
How to properly do nested routing in Obelisk?
我已经 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)
]
然而,这感觉很奇怪,因为我认为所有路由都会根据 ob init
的框架和其他专门定义路由的示例在 Common.Route
和 Obelisk.Route
中定义.我希望通过数据类型编码路由对 LambdaCase 进行详尽检查的安全性,而不必在所有可能的 backend/frontend 子路由上添加 BackendRoute_Missing 等价物。
data FrontendRoute :: * -> * where
FrontendRoute_Sub :: FrontendRoute (R SubRoute)
data SubRoute :: * -> * where
SubRoute_Foo :: SubRoute ()
然后将unitEncoder
替换为pathComponentEncoder $ \case ...
另一个例子见obelisk-oauth。
我已经 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)
]
然而,这感觉很奇怪,因为我认为所有路由都会根据 ob init
的框架和其他专门定义路由的示例在 Common.Route
和 Obelisk.Route
中定义.我希望通过数据类型编码路由对 LambdaCase 进行详尽检查的安全性,而不必在所有可能的 backend/frontend 子路由上添加 BackendRoute_Missing 等价物。
data FrontendRoute :: * -> * where
FrontendRoute_Sub :: FrontendRoute (R SubRoute)
data SubRoute :: * -> * where
SubRoute_Foo :: SubRoute ()
然后将unitEncoder
替换为pathComponentEncoder $ \case ...
另一个例子见obelisk-oauth。