module Web.Heroku (
dbConnParams
, parseDatabaseUrl
) where
import System.Environment
import Network.URI
import Data.Text
import Prelude
dbConnParams :: IO [(Text, Text)]
dbConnParams = getEnv "DATABASE_URL" >>= return . parseDatabaseUrl
parseDatabaseUrl :: String -> [(Text, Text)]
parseDatabaseUrl durl =
let muri = parseAbsoluteURI durl
(auth, path) = case muri of
Nothing -> error "couldn't parse absolute uri"
Just uri -> if uriScheme uri /= "postgres:"
then schemeError uri
else case uriAuthority uri of
Nothing -> invalid
Just a -> (a, uriPath uri)
(user,password) = userAndPassword auth
in [
(pack "user", user)
,(pack "password", Data.Text.tail password)
,(pack "host", pack $ uriRegName auth)
,(pack "dbname", pack $ Prelude.tail $ path)
]
where
userAndPassword :: URIAuth -> (Text, Text)
userAndPassword = (breakOn $ pack ":") . pack . Prelude.init . uriUserInfo
schemeError uri = error $ "was expecting a postgres scheme, not: " ++ (uriScheme uri) ++ "\n" ++ (show uri)
invalid = error "could not parse heroku DATABASE_URL"