packages feed

hs-hath-1.1.1: src/HathNetwork/Genesis.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TemplateHaskell #-}

module HathNetwork.Genesis
  ( Genesis(..)
  , fetchSettings
  , fetchCertificate
  , runGenesis
  , runGenesisIO
  ) where

import           Data.X509          ( CertificateChain, PrivKey )

import           Interface.API

import           Polysemy
import           Polysemy.Error     ( Error, errorToIOFinal )
import           Polysemy.Operators
import           Polysemy.Reader    ( Reader, runReader )

import           Relude             hiding ( Reader, runReader )

import           Servant.Client     ( ClientError )

import           Types

data Genesis m a where
  FetchSettings :: Genesis m HathSettings
  FetchCertificate :: Genesis m ( CertificateChain, PrivKey )

makeSem ''Genesis

{-# INLINE runGenesis #-}
runGenesis :: Members '[ Embed IO, Error RPCError, Reader ClientConfig, EHentaiAPI ] r
           => Genesis : r @> a
           -> Sem r a
runGenesis = interpret $ \case
  FetchSettings    -> getSettings
  FetchCertificate -> downloadCertificates

{-# INLINE runGenesisIO #-}
runGenesisIO
  :: ClientConfig
  -> [ Genesis
     , EHentaiAPI
     , Reader ClientConfig
     , Error ClientError
     , Error RPCError
     , Embed IO
     , Final IO
     ] @> a
  -> IO (Either RPCError (Either ClientError a))
runGenesisIO cfg
  = runFinal
  . embedToFinal @IO
  . errorToIOFinal @RPCError
  . errorToIOFinal @ClientError
  . runReader cfg
  . runEHentaiAPI
  . runGenesis