module Manatee.Core.Config where
import Control.Exception
import Data.Binary
import System.Directory
import System.FilePath
import System.IO
import qualified Control.Exception as Exc
import qualified Data.ByteString.Lazy as L
getConfigDirectory :: IO FilePath
getConfigDirectory = do
home <- getHomeDirectory
return $ home </> ".manatee"
browseHistoryPath :: FilePath
browseHistoryPath = "web/history"
pageTypeRulePath :: FilePath
pageTypeRulePath = "core/pageTypeRule"
fileOpenRulePath :: FilePath
fileOpenRulePath = "core/fileOpenRule"
pageModeRulePath :: FilePath
pageModeRulePath = "core/pageModeRule"
pageModeDuplicateList :: FilePath
pageModeDuplicateList = "core/pageModeDuplicateList"
writeConfig :: Binary a => FilePath -> a -> IO ()
writeConfig path config = do
configDir <- getConfigDirectory
let configPath = configDir </> path
bracket (openFile configPath WriteMode)
hClose
(\fileHandle -> L.hPutStr fileHandle (encode config))
readConfig :: Binary a => FilePath -> a -> IO a
readConfig path emptyConfig = do
configDir <- getConfigDirectory
let configPath = configDir </> path
isExist <- doesFileExist configPath
if isExist
then
bracket (openFile configPath ReadMode)
hClose
(\ fileHandle -> do
content <- L.hGetContents fileHandle
str <- Exc.evaluate content
if str == L.empty
then return emptyConfig
else
Exc.catch (return $ decode str)
(\ (_ :: IOException) -> return emptyConfig))
else do
createDirectoryIfMissing True (takeDirectory configPath)
bracket (openFile configPath WriteMode)
hClose
(`L.hPutStr` L.empty)
putStrLn ("Config file " ++ configPath ++ " doesn't exist, create it.")
return emptyConfig