-- | Blockfrost authentication scheme instance for HasClient
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Blockfrost.Client.Auth
( Project
) where
import Blockfrost.Auth
import Data.CaseInsensitive (mk)
import Data.Proxy (Proxy (..))
import Data.Sequence ((<|))
import GHC.TypeLits
import Servant.API ((:>))
import Servant.Client.Core (Client, HasClient (..), requestHeaders)
import qualified Data.ByteString.Char8
import qualified Data.Text.Encoding
instance {-# OVERLAPS #-} (HasClient m api, KnownSymbol sym) => HasClient m (ProjectAuth '[APIKeyInHeader sym] a :> api) where
type Client m (ProjectAuth '[APIKeyInHeader sym] a :> api) = Project -> Client m api
clientWithRoute m _ req proj
= clientWithRoute m (Proxy :: Proxy api)
$ req { requestHeaders = (headerName, headerVal) <| requestHeaders req }
where
headerVal = Data.Text.Encoding.encodeUtf8 $ projectId proj
headerName = mk $ Data.ByteString.Char8.pack $ symbolVal (Proxy @sym)
hoistClientMonad pm _ nt cl = hoistClientMonad pm (Proxy :: Proxy api) nt . cl