在编译时在 Scotty 中动态添加路由
Dynamically add routes at compile time in Scotty
是否可以使用模板 Haskell 或任何其他方式在编译时通过配置文件动态添加路由。
Scotty 有一个函数 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
好的,鉴于上面的列表,我假设您正在寻找等同于手写以下内容的东西:
{-! 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
只是 return 一个 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)
是否可以使用模板 Haskell 或任何其他方式在编译时通过配置文件动态添加路由。
Scotty 有一个函数 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
好的,鉴于上面的列表,我假设您正在寻找等同于手写以下内容的东西:
{-! 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
只是 return 一个 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)