{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}

module Cardano.CLI.Type.Error.GovernanceCmdError where

import Cardano.Api

data GovernanceCmdError
  = -- Voting related
    WriteFileError (FileError ())
  | -- Governance action related
    GovernanceCmdEmptyUpdateProposalError
  | GovernanceCmdMIRCertificateKeyRewardMistmach
      !FilePath
      !Int
      -- ^ Number of stake verification keys
      !Int
      -- ^ Number of reward amounts
  | GovernanceCmdEmptyCostModel !FilePath
  | -- | Maximum answer index
    GovernanceCmdPollOutOfBoundAnswer
      !Int
  | GovernanceCmdPollInvalidChoice
  | GovernanceCmdHashMismatchError
      !(Hash DRepMetadata)
      -- ^ Expected hash
      !(Hash DRepMetadata)
      -- ^ Actual hash
  deriving Int -> GovernanceCmdError -> ShowS
[GovernanceCmdError] -> ShowS
GovernanceCmdError -> String
(Int -> GovernanceCmdError -> ShowS)
-> (GovernanceCmdError -> String)
-> ([GovernanceCmdError] -> ShowS)
-> Show GovernanceCmdError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GovernanceCmdError -> ShowS
showsPrec :: Int -> GovernanceCmdError -> ShowS
$cshow :: GovernanceCmdError -> String
show :: GovernanceCmdError -> String
$cshowList :: [GovernanceCmdError] -> ShowS
showList :: [GovernanceCmdError] -> ShowS
Show

instance Error GovernanceCmdError where
  prettyError :: forall ann. GovernanceCmdError -> Doc ann
prettyError = \case
    WriteFileError FileError ()
fileError ->
      FileError () -> Doc ann
forall e ann. Error e => e -> Doc ann
forall ann. FileError () -> Doc ann
prettyError FileError ()
fileError
    GovernanceCmdError
GovernanceCmdEmptyUpdateProposalError ->
      Doc ann
"Empty update proposals are not allowed."
    GovernanceCmdMIRCertificateKeyRewardMistmach String
fp Int
nStakeVerKeys Int
nRewards ->
      Doc ann
"Error creating the MIR certificate at: "
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
fp
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" The number of staking keys: "
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow Int
nStakeVerKeys
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" and the number of reward amounts: "
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow Int
nRewards
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
" are not equivalent."
    GovernanceCmdEmptyCostModel String
fp ->
      Doc ann
"The decoded cost model was empty at: " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
fp
    GovernanceCmdPollOutOfBoundAnswer Int
maxIdx ->
      Doc ann
"Poll answer out of bounds. Choices are between 0 and " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall a ann. Show a => a -> Doc ann
pshow Int
maxIdx
    GovernanceCmdError
GovernanceCmdPollInvalidChoice ->
      Doc ann
"Invalid choice. Please choose from the available answers."
    GovernanceCmdHashMismatchError (DRepMetadataHash Hash HASH ByteString
expectedHash) (DRepMetadataHash Hash HASH ByteString
actualHash) ->
      Doc ann
"Hashes do not match!"
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\nExpected:"
          Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Hash HASH ByteString -> String
forall a. Show a => a -> String
show Hash HASH ByteString
expectedHash)
        Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"\n  Actual:"
          Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Hash HASH ByteString -> String
forall a. Show a => a -> String
show Hash HASH ByteString
actualHash)