Skip to content

Instantly share code, notes, and snippets.

@rcook
Created February 9, 2019 23:10
Show Gist options
  • Select an option

  • Save rcook/3c53d2085049b5ecfe786e95b13c8d74 to your computer and use it in GitHub Desktop.

Select an option

Save rcook/3c53d2085049b5ecfe786e95b13c8d74 to your computer and use it in GitHub Desktop.
Parse PostgreSQL database URL
parseDatabaseUrl :: String -> Maybe ConnectInfo
parseDatabaseUrl s = do
let (s1, s2) = break (== ':') s
unless (s1 == "postgres") (fail "Invalid scheme")
let (s3, s4) = break (\c -> c /= ':' && c /= '/') s2
unless (s3 == "://") (fail "Invalid separator")
let (user, s6) = break (== ':') s4
when (length user < 1) (fail "Invalid user")
let s7 = drop 1 s6
(password, s8) = break (== '@') s7
when (length password < 1) (fail "Invalid password")
let s9 = drop 1 s8
(host, s10) = break (== ':') s9
when (length host < 1) (fail "Invalid host")
let s11 = drop 1 s10
(portStr, s12) = break (== '/') s11
port <- readMaybe portStr
let database = drop 1 s12
when (length database < 1) (fail "Invalid database")
pure $ ConnectInfo host port user password database
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment