Динамически добавлять маршруты во время компиляции в Скотти
Можно ли динамически добавлять маршруты во время компиляции через файл конфигурации, используя 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)