Search code examples
haskellyesod

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


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: ["[email protected]", "[email protected]"]

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 = ["[email protected]", "[email protected]"]

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?


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).