{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}


module Cardano.Api.Protocol
  (
    -- * The enumeration of supported protocols
    Protocol(..)

    -- * Node client support
    -- | Support for the context needed to run a client of a node that is using
    -- a protocol.
  , localNodeConnectInfo
  , withlocalNodeConnectInfo
  , LocalNodeConnectInfoForSomeMode(..)
  ) where

import           Cardano.Prelude

import           Cardano.Chain.Slotting (EpochSlots (..))

import           Cardano.Api.Typed

import           Ouroboros.Consensus.Node.Run (RunNode)


data Protocol = ByronProtocol !EpochSlots
              | ShelleyProtocol
              | CardanoProtocol !EpochSlots
  deriving (Protocol -> Protocol -> Bool
(Protocol -> Protocol -> Bool)
-> (Protocol -> Protocol -> Bool) -> Eq Protocol
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Protocol -> Protocol -> Bool
$c/= :: Protocol -> Protocol -> Bool
== :: Protocol -> Protocol -> Bool
$c== :: Protocol -> Protocol -> Bool
Eq, Int -> Protocol -> ShowS
[Protocol] -> ShowS
Protocol -> String
(Int -> Protocol -> ShowS)
-> (Protocol -> String) -> ([Protocol] -> ShowS) -> Show Protocol
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Protocol] -> ShowS
$cshowList :: [Protocol] -> ShowS
show :: Protocol -> String
$cshow :: Protocol -> String
showsPrec :: Int -> Protocol -> ShowS
$cshowsPrec :: Int -> Protocol -> ShowS
Show)

data LocalNodeConnectInfoForSomeMode where

     LocalNodeConnectInfoForSomeMode
       :: RunNode block
       => LocalNodeConnectInfo mode block
       -> LocalNodeConnectInfoForSomeMode

withlocalNodeConnectInfo :: Protocol
                         -> NetworkId
                         -> FilePath
                         -> (forall mode block.
                                RunNode block
                             => LocalNodeConnectInfo mode block
                             -> a)
                         -> a
withlocalNodeConnectInfo :: Protocol
-> NetworkId
-> String
-> (forall mode block.
    RunNode block =>
    LocalNodeConnectInfo mode block -> a)
-> a
withlocalNodeConnectInfo Protocol
protocol NetworkId
network String
socketPath forall mode block.
RunNode block =>
LocalNodeConnectInfo mode block -> a
f =
    case Protocol -> NetworkId -> String -> LocalNodeConnectInfoForSomeMode
localNodeConnectInfo Protocol
protocol NetworkId
network String
socketPath of
      LocalNodeConnectInfoForSomeMode LocalNodeConnectInfo mode block
connctInfo -> LocalNodeConnectInfo mode block -> a
forall mode block.
RunNode block =>
LocalNodeConnectInfo mode block -> a
f LocalNodeConnectInfo mode block
connctInfo

localNodeConnectInfo :: Protocol
                     -> NetworkId
                     -> FilePath
                     -> LocalNodeConnectInfoForSomeMode
localNodeConnectInfo :: Protocol -> NetworkId -> String -> LocalNodeConnectInfoForSomeMode
localNodeConnectInfo Protocol
protocol NetworkId
network String
socketPath =
    case Protocol
protocol of

      ByronProtocol EpochSlots
epSlots ->
        LocalNodeConnectInfo ByronMode ByronBlockHFC
-> LocalNodeConnectInfoForSomeMode
forall block mode.
RunNode block =>
LocalNodeConnectInfo mode block -> LocalNodeConnectInfoForSomeMode
LocalNodeConnectInfoForSomeMode (LocalNodeConnectInfo ByronMode ByronBlockHFC
 -> LocalNodeConnectInfoForSomeMode)
-> LocalNodeConnectInfo ByronMode ByronBlockHFC
-> LocalNodeConnectInfoForSomeMode
forall a b. (a -> b) -> a -> b
$
          String
-> NetworkId
-> NodeConsensusMode ByronMode ByronBlockHFC
-> LocalNodeConnectInfo ByronMode ByronBlockHFC
forall mode block.
String
-> NetworkId
-> NodeConsensusMode mode block
-> LocalNodeConnectInfo mode block
LocalNodeConnectInfo
            String
socketPath NetworkId
network
            (EpochSlots -> NodeConsensusMode ByronMode ByronBlockHFC
ByronMode EpochSlots
epSlots)

      Protocol
ShelleyProtocol ->
        LocalNodeConnectInfo ShelleyMode (ShelleyBlockHFC StandardShelley)
-> LocalNodeConnectInfoForSomeMode
forall block mode.
RunNode block =>
LocalNodeConnectInfo mode block -> LocalNodeConnectInfoForSomeMode
LocalNodeConnectInfoForSomeMode (LocalNodeConnectInfo ShelleyMode (ShelleyBlockHFC StandardShelley)
 -> LocalNodeConnectInfoForSomeMode)
-> LocalNodeConnectInfo
     ShelleyMode (ShelleyBlockHFC StandardShelley)
-> LocalNodeConnectInfoForSomeMode
forall a b. (a -> b) -> a -> b
$
          String
-> NetworkId
-> NodeConsensusMode ShelleyMode (ShelleyBlockHFC StandardShelley)
-> LocalNodeConnectInfo
     ShelleyMode (ShelleyBlockHFC StandardShelley)
forall mode block.
String
-> NetworkId
-> NodeConsensusMode mode block
-> LocalNodeConnectInfo mode block
LocalNodeConnectInfo
            String
socketPath NetworkId
network
            NodeConsensusMode ShelleyMode (ShelleyBlockHFC StandardShelley)
ShelleyMode

      CardanoProtocol EpochSlots
epSlots ->
        LocalNodeConnectInfo CardanoMode (CardanoBlock StandardCrypto)
-> LocalNodeConnectInfoForSomeMode
forall block mode.
RunNode block =>
LocalNodeConnectInfo mode block -> LocalNodeConnectInfoForSomeMode
LocalNodeConnectInfoForSomeMode (LocalNodeConnectInfo CardanoMode (CardanoBlock StandardCrypto)
 -> LocalNodeConnectInfoForSomeMode)
-> LocalNodeConnectInfo CardanoMode (CardanoBlock StandardCrypto)
-> LocalNodeConnectInfoForSomeMode
forall a b. (a -> b) -> a -> b
$
          String
-> NetworkId
-> NodeConsensusMode CardanoMode (CardanoBlock StandardCrypto)
-> LocalNodeConnectInfo CardanoMode (CardanoBlock StandardCrypto)
forall mode block.
String
-> NetworkId
-> NodeConsensusMode mode block
-> LocalNodeConnectInfo mode block
LocalNodeConnectInfo
            String
socketPath NetworkId
network
            (EpochSlots
-> NodeConsensusMode CardanoMode (CardanoBlock StandardCrypto)
CardanoMode EpochSlots
epSlots)