Динамически добавлять маршруты во время компиляции в Скотти

Можно ли динамически добавлять маршруты во время компиляции через файл конфигурации, используя Template Haskell или любым другим способом.

У Скотти есть функция addRoute, но я хочу использовать ее динамически.

пример

import qualified Data.Text.Lazy as LTB

sampleRoutes :: [(String, LTB.Text)]
sampleRoutes = [("hello", LTB.pack "hello"), ("world", LTB.pack "world")]

Я хочу перебрать массив sampleRoutes и определить маршруты и ответы во время компиляции.

import Web.Scotty

main = scotty 3000 $ do
  middleware logStdoutDev
  someFunc sampleRoutes

1 ответ

Решение

Итак, учитывая приведенный выше список, я предполагаю, что вы ищете что-то, что эквивалентно написанию следующего вручную:

{-! LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Data.String

main = scotty 3000 $ do
  middleware logStdoutDev
  get (fromString $ '/' : "hello") (text "hello")
  get (fromString $ '/' : "world") (text "world")

Хорошая новость в том, что там нет ничего, что могло бы нуждаться в магии TH!

Помните, addroute / get это просто обычные функции, которые возвращают ScottyM () значение. Если у меня есть

r1 = get (fromString $ '/' : "hello") (text "hello")
r2 = get (fromString $ '/' : "world") (text "world")

тогда предыдущий main функция в точности эквивалентна

main = do
  middleware logStdoutDev
  r1
  r2

Это и общая структура r1 а также r2 предлагает следующее решение:

import Control.Monad (forM_)

main = do
  middleware logStdoutDev
  forM_ sampleRoutes $ \(name, response) -> 
    get (fromString $ '/':name) (text response)
Другие вопросы по тегам