{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TemplateHaskell #-} module Language.ATS.Package.Config ( UserConfig (..) , mkUserConfig , cfgBin ) where import qualified Data.ByteString.Lazy as BSL import Data.FileEmbed import qualified Data.Text.Lazy as TL import Quaalude data UserConfig = UserConfig { defaultPkgs :: Text , path :: Maybe Text , githubUsername :: Text , filterErrors :: Bool } deriving (Generic, Interpret, Binary) cfgFile :: String cfgFile = $(embedStringFile "dhall/config.dhall") defaultFileConfig :: FilePath -> IO () defaultFileConfig p = do let dir = p ++ "/.config/atspkg" createDirectoryIfMissing True dir writeFile (dir ++ "/config.dhall") cfgFile cfgBin :: (MonadIO m) => m (FilePath, FilePath) cfgBin = liftIO io where io = (id &&& (++ "/.atspkg/config")) <$> getEnv "HOME" mkUserConfig :: Rules () mkUserConfig = do (h, cfgBin') <- cfgBin join (unless <$> liftIO (doesFileExist cfgBin') <*> pure (g h cfgBin')) where g h cfgBin' = do let cfg = h ++ "/.config/atspkg/config.dhall" want [cfgBin'] readUserConfig h cfg cfgBin' %> \_ -> do need [cfg] cfgContents <- liftIO $ input auto (TL.pack cfg) liftIO $ BSL.writeFile cfgBin' (encode (cfgContents :: UserConfig)) readUserConfig :: FilePath -> FilePath -> Rules () readUserConfig h cfg = do want [cfg] e <- liftIO $ doesFileExist cfg cfg %> \_ -> unless e $ liftIO (defaultFileConfig h)