Tehnix
Tehnix

Reputation: 2040

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?

Upvotes: 3

Views: 1020

Answers (2)

pbrisbin
pbrisbin

Reputation: 151

You're a bit confused about the types of getExtra and extraAdmins.

I'm guessing they're like this:

getExtra :: Handler Extra

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

If so, something like this should work:

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

  return $ userIdent u `elem` extraAdmins extra

Upvotes: 0

Michael Snoyman
Michael Snoyman

Reputation: 31315

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

Upvotes: 4

Related Questions