{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Cardano.CLI.Types.Errors.QueryCmdError
  ( QueryCmdError (..)
  , renderQueryCmdError
  )
where

import           Cardano.Api hiding (QueryInShelleyBasedEra (..))
import           Cardano.Api.Shelley hiding (QueryInShelleyBasedEra (..))

import           Cardano.Binary (DecoderError)
import           Cardano.CLI.Helpers (HelpersError (..), renderHelpersError)
import           Cardano.CLI.Types.Errors.GenesisCmdError
import           Cardano.CLI.Types.Errors.QueryCmdLocalStateQueryError
import           Ouroboros.Consensus.Cardano.Block as Consensus (EraMismatch (..))
import qualified Ouroboros.Consensus.HardFork.History.Qry as Qry

import qualified Data.ByteString.Lazy.Char8 as LBS
import           Data.Text.Lazy.Builder (toLazyText)
import           Formatting.Buildable (build)

{- HLINT ignore "Move brackets to avoid $" -}
{- HLINT ignore "Redundant flip" -}

data QueryCmdError
  = QueryCmdLocalStateQueryError !QueryCmdLocalStateQueryError
  | QueryCmdConvenienceError !QueryConvenienceError
  | QueryCmdWriteFileError !(FileError ())
  | QueryCmdHelpersError !HelpersError
  | QueryCmdAcquireFailure !AcquiringFailure
  | QueryCmdByronEra
  | QueryCmdEraMismatch !EraMismatch
  | QueryCmdPastHorizon !Qry.PastHorizonException
  | QueryCmdSystemStartUnavailable
  | QueryCmdGenesisReadError !GenesisCmdError
  | QueryCmdLeaderShipError !LeadershipError
  | QueryCmdTextEnvelopeReadError !(FileError TextEnvelopeError)
  | QueryCmdTextReadError !(FileError InputDecodeError)
  | QueryCmdOpCertCounterReadError !(FileError TextEnvelopeError)
  | QueryCmdProtocolStateDecodeFailure !(LBS.ByteString, DecoderError)
  | QueryCmdPoolStateDecodeError DecoderError
  | QueryCmdStakeSnapshotDecodeError DecoderError
  | QueryCmdUnsupportedNtcVersion !UnsupportedNtcVersionError
  | QueryCmdProtocolParameterConversionError !ProtocolParametersConversionError
  | QueryCmdDRepKeyError !(FileError InputDecodeError)
  | QueryCmdSPOKeyError !(FileError InputDecodeError)
  | QueryCmdCommitteeColdKeyError !(FileError InputDecodeError)
  | QueryCmdCommitteeHotKeyError !(FileError InputDecodeError)
  deriving Int -> QueryCmdError -> ShowS
[QueryCmdError] -> ShowS
QueryCmdError -> String
(Int -> QueryCmdError -> ShowS)
-> (QueryCmdError -> String)
-> ([QueryCmdError] -> ShowS)
-> Show QueryCmdError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> QueryCmdError -> ShowS
showsPrec :: Int -> QueryCmdError -> ShowS
$cshow :: QueryCmdError -> String
show :: QueryCmdError -> String
$cshowList :: [QueryCmdError] -> ShowS
showList :: [QueryCmdError] -> ShowS
Show

renderQueryCmdError :: QueryCmdError -> Doc ann
renderQueryCmdError :: forall ann. QueryCmdError -> Doc ann
renderQueryCmdError = \case
  QueryCmdLocalStateQueryError QueryCmdLocalStateQueryError
lsqErr ->
    QueryCmdLocalStateQueryError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. QueryCmdLocalStateQueryError -> Doc ann
prettyError QueryCmdLocalStateQueryError
lsqErr
  QueryCmdWriteFileError FileError ()
fileErr ->
    FileError () -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError () -> Doc ann
prettyError FileError ()
fileErr
  QueryCmdHelpersError HelpersError
helpersErr ->
    HelpersError -> Doc ann
forall ann. HelpersError -> Doc ann
renderHelpersError HelpersError
helpersErr
  QueryCmdAcquireFailure AcquiringFailure
acquireFail ->
    AcquiringFailure -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow AcquiringFailure
acquireFail
  QueryCmdError
QueryCmdByronEra ->
    Doc ann
"This query cannot be used for the Byron era"
  QueryCmdEraMismatch (EraMismatch Text
ledgerEra Text
queryEra) ->
    Doc ann
"\nAn error mismatch occurred."
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\nSpecified query era: "
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
queryEra
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\nCurrent ledger era: "
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Text
ledgerEra
  QueryCmdPastHorizon PastHorizonException
e ->
    Doc ann
"Past horizon: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> PastHorizonException -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow PastHorizonException
e
  QueryCmdError
QueryCmdSystemStartUnavailable ->
    Doc ann
"System start unavailable"
  QueryCmdGenesisReadError GenesisCmdError
err' ->
    GenesisCmdError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. GenesisCmdError -> Doc ann
prettyError GenesisCmdError
err'
  QueryCmdLeaderShipError LeadershipError
e ->
    LeadershipError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. LeadershipError -> Doc ann
prettyError LeadershipError
e
  QueryCmdTextEnvelopeReadError FileError TextEnvelopeError
e ->
    FileError TextEnvelopeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError TextEnvelopeError -> Doc ann
prettyError FileError TextEnvelopeError
e
  QueryCmdTextReadError FileError InputDecodeError
e ->
    FileError InputDecodeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError InputDecodeError -> Doc ann
prettyError FileError InputDecodeError
e
  QueryCmdOpCertCounterReadError FileError TextEnvelopeError
e ->
    FileError TextEnvelopeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError TextEnvelopeError -> Doc ann
prettyError FileError TextEnvelopeError
e
  QueryCmdProtocolStateDecodeFailure (ByteString
_, DecoderError
decErr) ->
    Doc ann
"Failed to decode the protocol state: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty (Builder -> Text
toLazyText (Builder -> Text) -> Builder -> Text
forall a b. (a -> b) -> a -> b
$ DecoderError -> Builder
forall p. Buildable p => p -> Builder
build DecoderError
decErr)
  QueryCmdPoolStateDecodeError DecoderError
decoderError ->
    Doc ann
"Failed to decode PoolState.  Error: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> DecoderError -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow DecoderError
decoderError
  QueryCmdStakeSnapshotDecodeError DecoderError
decoderError ->
    Doc ann
"Failed to decode StakeSnapshot.  Error: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> DecoderError -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow DecoderError
decoderError
  QueryCmdUnsupportedNtcVersion (UnsupportedNtcVersionError MinNodeToClientVersion
minNtcVersion MinNodeToClientVersion
ntcVersion) ->
    Doc ann
"Unsupported feature for the node-to-client protocol version.\n"
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"This query requires at least "
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> MinNodeToClientVersion -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow MinNodeToClientVersion
minNtcVersion
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" but the node negotiated "
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> MinNodeToClientVersion -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow MinNodeToClientVersion
ntcVersion
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
".\n"
      Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"Later node versions support later protocol versions (but development protocol versions are not enabled in the node by default)."
  QueryCmdProtocolParameterConversionError ProtocolParametersConversionError
ppce ->
    Doc ann
"Failed to convert protocol parameter: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> ProtocolParametersConversionError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. ProtocolParametersConversionError -> Doc ann
prettyError ProtocolParametersConversionError
ppce
  QueryCmdConvenienceError QueryConvenienceError
qce ->
    Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Text -> Doc ann) -> Text -> Doc ann
forall a b. (a -> b) -> a -> b
$ QueryConvenienceError -> Text
renderQueryConvenienceError QueryConvenienceError
qce
  QueryCmdDRepKeyError FileError InputDecodeError
e ->
    Doc ann
"Error reading delegation representative key: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> FileError InputDecodeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError InputDecodeError -> Doc ann
prettyError FileError InputDecodeError
e
  QueryCmdSPOKeyError FileError InputDecodeError
e ->
    Doc ann
"Error reading Stake Pool Operator key: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> FileError InputDecodeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError InputDecodeError -> Doc ann
prettyError FileError InputDecodeError
e
  QueryCmdCommitteeColdKeyError FileError InputDecodeError
e ->
    Doc ann
"Error reading committee cold key: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> FileError InputDecodeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError InputDecodeError -> Doc ann
prettyError FileError InputDecodeError
e
  QueryCmdCommitteeHotKeyError FileError InputDecodeError
e ->
    Doc ann
"Error reading committee hot key: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> FileError InputDecodeError -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError InputDecodeError -> Doc ann
prettyError FileError InputDecodeError
e