Как правильно сделать вложенную маршрутизацию в Обелиске? - PullRequest
4 голосов
/ 01 апреля 2020

Я искал примеры , однако большинство примеров делают RouteSomething -> PathSegment "firstpath" $ unitEncoder mempty, а не один вложенный маршрут.

Есть несколько примеров, которые используют Cat.id для прохождения всего URI как текст, такой как Character-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 на все возможные подчиненные модули backend / frontend.

1 Ответ

3 голосов
/ 05 апреля 2020
data FrontendRoute :: * -> * where
  FrontendRoute_Sub :: FrontendRoute (R SubRoute)
data SubRoute :: * -> * where
  SubRoute_Foo :: SubRoute ()

Затем замените unitEncoder на pathComponentEncoder $ \case ...

См. obelisk-oauth для другого примера.

...