module Airbrake.Credentials (
APIKey,
credentialsDefaultFile, credentialsDefaultKey,
loadCredentialsFromFile, loadCredentialsFromEnv,
loadCredentialsFromEnvOrFile, loadCredentialsDefault
) where
import Control.Monad (liftM)
import Control.Monad.IO.Class
import Data.Functor
import Data.List (find)
import System.Directory
import System.Environment
import System.FilePath
type APIKey = String
credentialsDefaultFile :: MonadIO m => m FilePath
credentialsDefaultFile = liftIO $ liftM (</> ".airbrake-keys") getHomeDirectory
credentialsDefaultKey :: String
credentialsDefaultKey = "default"
loadCredentialsFromFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)
loadCredentialsFromFile file key = liftIO $ do
contents <- map words . lines <$> readFile file
return $ do
[_k, apikey] <- find (hasKey key) contents
return apikey
where
hasKey _ [] = False
hasKey k (k2 : _) = k == k2
loadCredentialsDefault :: MonadIO m => m (Maybe APIKey)
loadCredentialsDefault = do
file <- credentialsDefaultFile
loadCredentialsFromEnvOrFile file credentialsDefaultKey
loadCredentialsFromEnv :: MonadIO m => m (Maybe APIKey)
loadCredentialsFromEnv = liftIO $ do
env <- getEnvironment
let lk = flip lookup env
key = lk "AIRBRAKE_API_KEY"
return key
loadCredentialsFromEnvOrFile :: MonadIO m => FilePath -> String -> m (Maybe APIKey)
loadCredentialsFromEnvOrFile file key = do
envcr <- loadCredentialsFromEnv
case envcr of
Just cr -> return (Just cr)
Nothing -> loadCredentialsFromFile file key