packages feed

cachix-0.1.2: src/Cachix/Client/Config.hs

{-# LANGUAGE DeriveAnyClass #-}
module Cachix.Client.Config
  ( Config(..)
  , BinaryCacheConfig(..)
  , readConfig
  , writeConfig
  , getDefaultFilename
  , ConfigPath
  , mkConfig
  ) where

import Dhall     hiding ( Text )
import Dhall.Pretty     ( prettyExpr )
import GHC.Generics     ( Generic )
import System.Directory ( doesFileExist, createDirectoryIfMissing
                        , getXdgDirectory, XdgDirectory(..)
                        )
import System.Posix.Files ( setFileMode, unionFileModes, ownerReadMode
                          , ownerWriteMode )
import System.FilePath.Posix ( takeDirectory )
import Protolude


data BinaryCacheConfig = BinaryCacheConfig
 { name :: Text
 , secretKey :: Text
 } deriving (Show, Generic, Interpret, Inject)

data Config = Config
 { authToken :: Text
 , binaryCaches :: [BinaryCacheConfig]
 } deriving (Show, Generic, Interpret, Inject)

mkConfig :: Text -> Config
mkConfig authtoken = Config
  { authToken = authtoken
  , binaryCaches = []
  }

type ConfigPath = FilePath

readConfig :: ConfigPath -> IO (Maybe Config)
readConfig filename = do
  doesExist <- doesFileExist filename
  if doesExist
  then Just <$> input auto (toS filename)
  else return Nothing

getDefaultFilename :: IO FilePath
getDefaultFilename = do
  dir <- getXdgDirectory XdgConfig "cachix"
  return $ dir <> "/cachix.dhall"

writeConfig :: ConfigPath -> Config -> IO ()
writeConfig filename config = do
  let doc = prettyExpr $ embed inject config
  createDirectoryIfMissing True (takeDirectory filename)
  writeFile filename $ show doc
  assureFilePermissions filename
  putStrLn $ "Written to " <> filename

-- chmod rw filepath
assureFilePermissions :: FilePath -> IO ()
assureFilePermissions fp =
  setFileMode fp $ unionFileModes ownerReadMode ownerWriteMode