module Rob.Config where
import qualified Rob.Package as Package
import Rob.Logger (err, warning, success, info, flatten)
import Rob.UserMessages (configFileFound, noConfigFileFound, configFileCreated, noTemplatesAvailable, tryAddingATemplate)
import Rob.Types (Config(..), Template(..))
import Data.Maybe
import System.Exit
import System.FilePath (joinPath)
import System.Directory (getHomeDirectory, doesFileExist)
import Data.Yaml (encodeFile, decodeFile)
configFileName :: String
configFileName = "." ++ Package.name
configFilePath :: IO FilePath
configFilePath = do
home <- getHomeDirectory
return $ joinPath [home, configFileName]
write :: Config -> IO Config
write config = do
configFilePath >>= \path -> encodeFile path config
return config
get :: IO Config
get = do
path <- configFilePath
hasConfigPath <- doesFileExist path
if hasConfigPath
then do
success $ configFileFound path
config <- decodeFile path
return $ fromJust config
else do
warning $ noConfigFileFound configFileName
flatten info $ configFileCreated path
write $ Config []
errorNoTemplatesAvailable :: IO ()
errorNoTemplatesAvailable = do
err noTemplatesAvailable
warning tryAddingATemplate
exitFailure
addTemplate :: Config -> String -> String -> IO Config
addTemplate (Config templates) name path = write $ Config newTemplates
where
newTemplate = Template name path
newTemplates = if newTemplate `elem` templates then
map (\t -> if t == newTemplate then newTemplate else t) templates
else
templates ++ [newTemplate]
deleteTemplate :: Config -> String -> IO Config
deleteTemplate (Config templates) nameToRemove = write $ Config newTemplates
where
newTemplates = (\(Template name _) -> name /= nameToRemove) `filter` templates