packages feed

cachix-0.3.0: src/Cachix/Client/Servant.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -O0 #-} -- TODO https://github.com/haskell-servant/servant/issues/986

module Cachix.Client.Servant
  ( isErr
  , cachixClient
  , cachixBCClient
  , cachixBCStreamingClient
  , runAuthenticatedClient
  , Cachix.Client.Servant.ClientError
  ) where

import           Protolude

import qualified Cachix.Api as Api
import           Cachix.Api.Error
import qualified Cachix.Client.Config as Config
import qualified Cachix.Client.Env as Env
import qualified Cachix.Client.Exception as Exception
import           Network.HTTP.Types (Status)
import           Servant.API.Generic
import           Servant.Auth             ()
import           Servant.Auth.Client      (Token)
import qualified Servant.Client
import           Servant.Client.Generic   (AsClientT)
import           Servant.Client.Streaming hiding (ClientError)
import           Servant.Conduit          ()

type ClientError =
#if !MIN_VERSION_servant_client(0,16,0)
  Servant.Client.ServantError
#else
  Servant.Client.ClientError
#endif

isErr :: ClientError -> Status -> Bool
#if MIN_VERSION_servant_client(0,16,0)
isErr (Servant.Client.FailureResponse _ resp) status
#else
isErr (Servant.Client.FailureResponse resp) status
#endif
  | Servant.Client.responseStatusCode resp == status = True
isErr _ _ = False

cachixClient :: Api.CachixAPI (AsClientT ClientM)
cachixClient = fromServant $ client Api.servantApi

cachixBCClient :: Text -> Api.BinaryCacheAPI (AsClientT ClientM)
cachixBCClient name = fromServant $ Api.cache cachixClient name

cachixBCStreamingClient :: Text -> Api.BinaryCacheStreamingAPI (AsClientT ClientM)
cachixBCStreamingClient name = fromServant $ client (Proxy :: Proxy Api.BinaryCachStreamingServantAPI) name

runAuthenticatedClient :: NFData a => Env.Env -> (Token -> ClientM a) -> IO a
runAuthenticatedClient env m = do
  config <- escalate $ maybeToEither (Exception.NoConfig
     "Start with visiting https://cachix.org and copying the token to $ cachix authtoken <token>") (Env.config env)
  escalate
    =<< ((`runClientM` Env.clientenv env)
    $ m (Config.authToken config))