{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Bcc.CLI.Cole.Query
  ( ColeQueryError(..)
  , renderColeQueryError
  , runGetLocalNodeTip
  ) where
import           Bcc.Prelude
import           Control.Monad.Trans.Except.Extra (firstExceptT)
import           Data.Aeson.Encode.Pretty (encodePretty)
import qualified Data.ByteString.Lazy as LB
import qualified Data.Text.Encoding as Text
import           Bcc.Api
import           Bcc.CLI.Environment (EnvSocketError, readEnvSocketPath, renderEnvSocketError)
import           Bcc.CLI.Types (SocketPath (..))
newtype ColeQueryError = ColeQueryEnvVarSocketErr EnvSocketError
  deriving Int -> ColeQueryError -> ShowS
[ColeQueryError] -> ShowS
ColeQueryError -> String
(Int -> ColeQueryError -> ShowS)
-> (ColeQueryError -> String)
-> ([ColeQueryError] -> ShowS)
-> Show ColeQueryError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColeQueryError] -> ShowS
$cshowList :: [ColeQueryError] -> ShowS
show :: ColeQueryError -> String
$cshow :: ColeQueryError -> String
showsPrec :: Int -> ColeQueryError -> ShowS
$cshowsPrec :: Int -> ColeQueryError -> ShowS
Show
renderColeQueryError :: ColeQueryError -> Text
renderColeQueryError :: ColeQueryError -> Text
renderColeQueryError ColeQueryError
err =
  case ColeQueryError
err of
    ColeQueryEnvVarSocketErr EnvSocketError
sockEnvErr -> EnvSocketError -> Text
renderEnvSocketError EnvSocketError
sockEnvErr
runGetLocalNodeTip :: NetworkId -> ExceptT ColeQueryError IO ()
runGetLocalNodeTip :: NetworkId -> ExceptT ColeQueryError IO ()
runGetLocalNodeTip NetworkId
networkId = do
    SocketPath String
sockPath <- (EnvSocketError -> ColeQueryError)
-> ExceptT EnvSocketError IO SocketPath
-> ExceptT ColeQueryError IO SocketPath
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT EnvSocketError -> ColeQueryError
ColeQueryEnvVarSocketErr
                           ExceptT EnvSocketError IO SocketPath
readEnvSocketPath
    let connctInfo :: LocalNodeConnectInfo ColeMode
connctInfo =
          LocalNodeConnectInfo :: forall mode.
ConsensusModeParams mode
-> NetworkId -> String -> LocalNodeConnectInfo mode
LocalNodeConnectInfo {
            localNodeSocketPath :: String
localNodeSocketPath    = String
sockPath,
            localNodeNetworkId :: NetworkId
localNodeNetworkId     = NetworkId
networkId,
            localConsensusModeParams :: ConsensusModeParams ColeMode
localConsensusModeParams = EpochSlots -> ConsensusModeParams ColeMode
ColeModeParams (Word64 -> EpochSlots
EpochSlots Word64
21600)
          }
    ChainTip
tip <- IO ChainTip -> ExceptT ColeQueryError IO ChainTip
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ChainTip -> ExceptT ColeQueryError IO ChainTip)
-> IO ChainTip -> ExceptT ColeQueryError IO ChainTip
forall a b. (a -> b) -> a -> b
$ LocalNodeConnectInfo ColeMode -> IO ChainTip
forall mode. LocalNodeConnectInfo mode -> IO ChainTip
getLocalChainTip LocalNodeConnectInfo ColeMode
connctInfo
    IO () -> ExceptT ColeQueryError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ColeQueryError IO ())
-> (ByteString -> IO ())
-> ByteString
-> ExceptT ColeQueryError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> IO ()
putTextLn (Text -> IO ()) -> (ByteString -> Text) -> ByteString -> IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> Text
Text.decodeUtf8 (ByteString -> Text)
-> (ByteString -> ByteString) -> ByteString -> Text
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString
LB.toStrict (ByteString -> ExceptT ColeQueryError IO ())
-> ByteString -> ExceptT ColeQueryError IO ()
forall a b. (a -> b) -> a -> b
$ ChainTip -> ByteString
forall a. ToJSON a => a -> ByteString
encodePretty ChainTip
tip