haskell - 如何从 yesod settings.yml 文件中获取值

标签 haskell yesod

我正在使用 yesod 脚手架。我正在为如何从 settings.yml 文件中获取值而苦苦挣扎,

settings.yml 文件的相关部分如下所示,

Default: &defaults
  host: "*4" # any IPv4 host
  port: 3000
  approot: "http://localhost:3000"
  admins: ["someEmail@gmail.com", "someOtherEmail@gmail.com"]

然后在我的 Foundation.hs 文件中,我有一个方法来检查用户电子邮件(使用 googleauth)是否与预先指定的电子邮件匹配,

admins = ["someEmail@gmail.com", "someOtherEmail@gmail.com"]

isAdmin (Just (Entity _ user)) | elem (userIdent user) admins = Authorized
                               | otherwise                    = AuthenticationRequired
isAdmin Nothing = AuthenticationRequired

我的目标是将 admins 函数替换为 settings.yml 文件中的函数,因为它看起来更合适。

如有任何帮助,我们将不胜感激!

编辑:

好的,我已经使用以下方法获取新制作的“extra”,

admins = do
    madmins <- extraAdmins getExtra
    case madmins of
        Nothing -> return Nothing
        Just admins -> return admins

但是 GHC 向我抛出这个,

Foundation.hs:161:28:
    Couldn't match expected type `Extra'
                with actual type `Handler Extra'
    In the first argument of `extraAdmins', namely `getExtra'
    In a stmt of a 'do' block: madmins <- extraAdmins getExtra
    In the expression:
      do { madmins <- extraAdmins getExtra;
           case madmins of {
             Nothing -> return Nothing
             Just admins -> return admins } }

有没有办法将它从 Handler Extra 转换为 Extra,还是我只是用错了方法?

最佳答案

在脚手架中的Settings.hs文件的末尾,有Extra的定义以及如何解析它:

data Extra = Extra
    { extraCopyright :: Text
    , extraAnalytics :: Maybe Text -- ^ Google Analytics
    } deriving Show

parseExtra :: DefaultEnv -> Object -> Parser Extra
parseExtra _ o = Extra
    <$> o .:  "copyright"
    <*> o .:? "analytics"

您可以将所需的额外数据添加到此结构并在那里进行解析。在应用的其余部分,您可以使用 getExtra(在 Foundation.hs 中定义)访问此值。

关于haskell - 如何从 yesod settings.yml 文件中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520237/

相关文章:

forms - 带有页面流的 Yesod 表单

python - 根据之前的结果选择解析器

haskell - CPP : Macros in Haskell

swift - 如何在 swift 中为 HKT 声明协议(protocol)?

haskell - IO()和IO有什么区别?

algorithm - 查询球体表面近点的快速算法/数据结构是什么?

haskell - Yesod:与 Lucius 合作时出现奇怪的错误

postgresql - 构建数据库

haskell - Yesod 一个站点有多个持久后端

entity - 带有 Eq 的 Yesod/Persistent 字段