packages feed

cachix-0.3.8: src/Cachix/Client/Env.hs

module Cachix.Client.Env
  ( Env (..),
    mkEnv,
    cachixVersion,
    customManagerSettings,
  )
where

import Cachix.Client.Config (Config, readConfig)
import Cachix.Client.OptionsParser (CachixOptions (..))
import Cachix.Client.Store (Store, openStore)
import Cachix.Client.URI (getBaseUrl)
import Data.Version (showVersion)
import Network.HTTP.Client
  ( ManagerSettings,
    managerModifyRequest,
    managerResponseTimeout,
    responseTimeoutNone,
  )
import Network.HTTP.Client.TLS (newTlsManagerWith, tlsManagerSettings)
import Network.HTTP.Simple (setRequestHeader)
import Paths_cachix (version)
import Protolude
import Servant.Client (ClientEnv, mkClientEnv)
import System.Directory (canonicalizePath)

data Env
  = Env
      { config :: Maybe Config,
        clientenv :: ClientEnv,
        cachixoptions :: CachixOptions,
        storeAsync :: Async Store
      }

mkEnv :: CachixOptions -> IO Env
mkEnv rawcachixoptions = do
  store <- async openStore
  -- make sure path to the config is passed as absolute to dhall logic
  canonicalConfigPath <- canonicalizePath (configPath rawcachixoptions)
  let cachixOptions = rawcachixoptions {configPath = canonicalConfigPath}
  cfg <- readConfig $ configPath cachixOptions
  manager <- newTlsManagerWith customManagerSettings
  let clientEnv = mkClientEnv manager $ getBaseUrl (host cachixOptions)
  return
    Env
      { config = cfg,
        clientenv = clientEnv,
        cachixoptions = cachixOptions,
        storeAsync = store
      }

customManagerSettings :: ManagerSettings
customManagerSettings =
  tlsManagerSettings
    { managerResponseTimeout = responseTimeoutNone,
      -- managerModifyRequest :: Request -> IO Request
      managerModifyRequest = return . setRequestHeader "User-Agent" [toS cachixVersion]
    }

cachixVersion :: Text
cachixVersion = "cachix " <> toS (showVersion version)