How to get a value from the yesod settings.yml file

haskell, yesod

Solution

At the end of the Settings.hs file in the scaffolding, there's the definition of `Extra` and how to parse it:

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

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

You can add the extra data you want to this structure and parse it there. From the rest of your app, you can access this value with `getExtra` (defined in Foundation.hs).

Problem

I'm using the yesod scaffold. I'm struggeling a bit with how to get a value from the settings.yml file, The relevant part of the settings.yml file looks like this, ``` Default: &defaults host: "*4" # any IPv4 host port: 3000 approot: "http://localhost:3000" admins: ["someEmail@gmail.com", "someOtherEmail@gmail.com"] ``` And then in my Foundation.hs file I have a method to check if the users email (using googleauth) matches a pre-specified email, ``` admins = ["someEmail@gmail.com", "someOtherEmail@gmail.com"] isAdmin (Just (Entity _ user)) | elem (userIdent user) admins = Authorized | otherwise = AuthenticationRequired isAdmin Nothing = AuthenticationRequired ``` My goal is to replace the admins function with the one from the the settings.yml file because it seems more appropriate. Any help on doing this would be greatly appreciated! EDIT: Okay, I've come as far as fetching the newly made "extra" with the following method, ``` admins = do madmins <- extraAdmins getExtra case madmins of Nothing -> return Nothing Just admins -> return admins ``` But the GHC throws this at me, ``` 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 } } ``` Is there a way to convert it from Handler Extra to Extra, or am I simply doing it the wrong way?

Original source