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

时间:2012-11-22 21:31:30

标签: 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

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

非常感谢任何有关这方面的帮助!

编辑:

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

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,或者我只是以错误的方式进行操作?

2 个答案:

答案 0 :(得分:4)

在脚手架中的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中定义)访问此值。

答案 1 :(得分:0)

您对getExtraextraAdmins的类型感到有点困惑。

我猜它们是这样的:

getExtra :: Handler Extra

extraAdmins :: Extra -> [Text] -- maybe?

如果是这样,这样的事情应该有效:

isAdmin :: User -> Handler Bool
isAdmin u = do
  extra <- getExtra

  return $ userIdent u `elem` extraAdmins extra