unused-0.5.0.2: src/Unused/ResultsClassifier/Config.hs
module Unused.ResultsClassifier.Config
( loadConfig
, loadAllConfigurations
) where
import qualified Data.Yaml as Y
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as C
import qualified Data.Either as E
import qualified Data.Bifunctor as B
import System.FilePath ((</>))
import System.Directory (getHomeDirectory)
import Paths_unused (getDataFileName)
import Unused.ResultsClassifier.Types (LanguageConfiguration, ParseConfigError(..))
import Unused.Util (readIfFileExists)
loadConfig :: IO (Either String [LanguageConfiguration])
loadConfig = Y.decodeEither <$> readConfig
loadAllConfigurations :: IO (Either [ParseConfigError] [LanguageConfiguration])
loadAllConfigurations = do
homeDir <- getHomeDirectory
defaultConfig <- addSourceToLeft "default config" <$> loadConfig
localConfig <- loadConfigFromFile ".unused.yml"
userConfig <- loadConfigFromFile $ homeDir </> ".unused.yml"
let (lefts, rights) = E.partitionEithers [defaultConfig, localConfig, userConfig]
if not (null lefts)
then return $ Left lefts
else return $ Right $ concat rights
loadConfigFromFile :: String -> IO (Either ParseConfigError [LanguageConfiguration])
loadConfigFromFile path = do
file <- fmap C.pack <$> readIfFileExists path
return $ case file of
Nothing -> Right []
Just body -> addSourceToLeft path $ Y.decodeEither body
addSourceToLeft :: String -> Either String c -> Either ParseConfigError c
addSourceToLeft source = B.first (ParseConfigError source)
readConfig :: IO BS.ByteString
readConfig = getDataFileName ("data" </> "config.yml") >>= BS.readFile