Skip to content

Commit

Permalink
Simplify shelley cli errors
Browse files Browse the repository at this point in the history
  • Loading branch information
Jimbo4350 committed Aug 3, 2020
1 parent 448657e commit aaddfda
Show file tree
Hide file tree
Showing 10 changed files with 186 additions and 233 deletions.
24 changes: 12 additions & 12 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Address.hs
Expand Up @@ -24,18 +24,18 @@ import Cardano.CLI.Shelley.Run.Address.Info (ShelleyAddressInfoError,
import Cardano.CLI.Types

data ShelleyAddressCmdError
= ShelleyAddressCmdAddressInfoError !ShelleyAddressInfoError
| ShelleyAddressCmdReadFileError !(FileError TextEnvelopeError)
| ShelleyAddressCmdWriteFileError !(FileError ())
= AddressInfoError !ShelleyAddressInfoError
| ReadFileError !(FileError TextEnvelopeError)
| WriteFileError !(FileError ())
deriving Show

renderShelleyAddressCmdError :: ShelleyAddressCmdError -> Text
renderShelleyAddressCmdError err =
case err of
ShelleyAddressCmdAddressInfoError addrInfoErr ->
AddressInfoError addrInfoErr ->
Text.pack (displayError addrInfoErr)
ShelleyAddressCmdReadFileError fileErr -> Text.pack (displayError fileErr)
ShelleyAddressCmdWriteFileError fileErr -> Text.pack (displayError fileErr)
ReadFileError fileErr -> Text.pack (displayError fileErr)
WriteFileError fileErr -> Text.pack (displayError fileErr)

runAddressCmd :: AddressCmd -> ExceptT ShelleyAddressCmdError IO ()
runAddressCmd cmd =
Expand All @@ -44,7 +44,7 @@ runAddressCmd cmd =
AddressKeyHash vkf mOFp -> runAddressKeyHash vkf mOFp
AddressBuild payVk stkVk nw mOutFp -> runAddressBuild payVk stkVk nw mOutFp
AddressBuildMultiSig {} -> runAddressBuildMultiSig
AddressInfo txt mOFp -> firstExceptT ShelleyAddressCmdAddressInfoError $ runAddressInfo txt mOFp
AddressInfo txt mOFp -> firstExceptT AddressInfoError $ runAddressInfo txt mOFp


runAddressKeyGen :: AddressKeyType
Expand All @@ -60,10 +60,10 @@ runAddressKeyGen kt (VerificationKeyFile vkeyPath) (SigningKeyFile skeyPath) =
generateAndWriteKeyFiles asType = do
skey <- liftIO $ generateSigningKey asType
let vkey = getVerificationKey skey
firstExceptT ShelleyAddressCmdWriteFileError
firstExceptT WriteFileError
. newExceptT
$ writeFileTextEnvelope skeyPath (Just skeyDesc) skey
firstExceptT ShelleyAddressCmdWriteFileError
firstExceptT WriteFileError
. newExceptT
$ writeFileTextEnvelope vkeyPath (Just vkeyDesc) vkey

Expand All @@ -76,7 +76,7 @@ runAddressKeyHash :: VerificationKeyFile
-> Maybe OutputFile
-> ExceptT ShelleyAddressCmdError IO ()
runAddressKeyHash vkeyPath mOutputFp = do
vkey <- firstExceptT ShelleyAddressCmdReadFileError $
vkey <- firstExceptT ReadFileError $
readAddressVerificationKeyFile vkeyPath

let hexKeyHash = foldSomeAddressVerificationKey
Expand All @@ -93,7 +93,7 @@ runAddressBuild :: VerificationKeyFile
-> Maybe OutputFile
-> ExceptT ShelleyAddressCmdError IO ()
runAddressBuild payVkeyFp mstkVkeyFp nw mOutFp = do
payVKey <- firstExceptT ShelleyAddressCmdReadFileError $
payVKey <- firstExceptT ReadFileError $
readAddressVerificationKeyFile payVkeyFp

addr <- case payVKey of
Expand Down Expand Up @@ -121,7 +121,7 @@ runAddressBuild payVkeyFp mstkVkeyFp nw mOutFp = do
case mstkVkeyFp of
Nothing -> pure Nothing
Just (VerificationKeyFile stkVkeyFp) ->
firstExceptT ShelleyAddressCmdReadFileError $
firstExceptT ReadFileError $
fmap Just $ newExceptT $
readFileTextEnvelope (AsVerificationKey AsStakeKey) stkVkeyFp

Expand Down
71 changes: 30 additions & 41 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Genesis.hs
Expand Up @@ -49,28 +49,20 @@ import Cardano.CLI.Shelley.Parsers (renderTxIn)
import Cardano.CLI.Types

data ShelleyGenesisCmdError
= ShelleyGenesisCmdReadGenesisAesonDecodeError !FilePath !Text
| ShelleyGenesisCmdReadGenesisIOError !FilePath !IOException
| ShelleyGenesisCmdWriteDefaultGenesisIOError !FilePath !IOException
| ShelleyGenesisCmdWriteGenesisIOError !FilePath !IOException
= AesonDecodeError !FilePath !Text
| GenesisFileError !(FileError ())
| ShelleyGenesisCmdMismatchedGenesisKeyFiles [Int] [Int] [Int]
| ShelleyGenesisCmdFilesNoIndex [FilePath]
| ShelleyGenesisCmdFilesDupIndex [FilePath]
| ShelleyGenesisCmdReadFileError !(FileError TextEnvelopeError)
| ShelleyGenesisCmdWriteFileError !(FileError ())
| TextEnvReadFileError !(FileError TextEnvelopeError)
deriving Show

renderShelleyGenesisCmdError :: ShelleyGenesisCmdError -> Text
renderShelleyGenesisCmdError err =
case err of
ShelleyGenesisCmdReadGenesisAesonDecodeError fp decErr ->
AesonDecodeError fp decErr ->
"Error while decoding Shelley genesis at: " <> textShow fp <> " Error: " <> textShow decErr
ShelleyGenesisCmdReadGenesisIOError fp ioException ->
"Error while reading Shelley genesis at: " <> textShow fp <> " Error: " <> textShow ioException
ShelleyGenesisCmdWriteDefaultGenesisIOError fp ioException ->
"Error while writing default genesis at: " <> textShow fp <> " Error: " <> textShow ioException
ShelleyGenesisCmdWriteGenesisIOError fp ioException ->
"Error while writing Shelley genesis at: " <> textShow fp <> " Error: " <> textShow ioException
GenesisFileError fe -> Text.pack $ displayError fe
ShelleyGenesisCmdMismatchedGenesisKeyFiles gfiles dfiles vfiles ->
"Mismatch between the files found:\n"
<> "Genesis key file indexes: " <> textShow gfiles
Expand All @@ -82,10 +74,7 @@ renderShelleyGenesisCmdError err =
ShelleyGenesisCmdFilesDupIndex files ->
"The genesis keys files are expected to have a unique numeric index but these do not:\n"
<> Text.unlines (map Text.pack files)
ShelleyGenesisCmdReadFileError fileErr ->
Text.pack (displayError fileErr)
ShelleyGenesisCmdWriteFileError fileErr ->
Text.pack (displayError fileErr)
TextEnvReadFileError fileErr -> Text.pack $ displayError fileErr


runGenesisCmd :: GenesisCmd -> ExceptT ShelleyGenesisCmdError IO ()
Expand All @@ -109,10 +98,10 @@ runGenesisKeyGenGenesis (VerificationKeyFile vkeyPath)
(SigningKeyFile skeyPath) = do
skey <- liftIO $ generateSigningKey AsGenesisKey
let vkey = getVerificationKey skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope skeyPath (Just skeyDesc) skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope vkeyPath (Just vkeyDesc) vkey
where
Expand All @@ -130,13 +119,13 @@ runGenesisKeyGenDelegate (VerificationKeyFile vkeyPath)
(OpCertCounterFile ocertCtrPath) = do
skey <- liftIO $ generateSigningKey AsGenesisDelegateKey
let vkey = getVerificationKey skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope skeyPath (Just skeyDesc) skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope vkeyPath (Just vkeyDesc) vkey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope ocertCtrPath (Just certCtrDesc)
$ OperationalCertificateIssueCounter
Expand All @@ -158,10 +147,10 @@ runGenesisKeyGenDelegateVRF (VerificationKeyFile vkeyPath)
(SigningKeyFile skeyPath) = do
skey <- liftIO $ generateSigningKey AsVrfKey
let vkey = getVerificationKey skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope skeyPath (Just skeyDesc) skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope vkeyPath (Just vkeyDesc) vkey
where
Expand All @@ -176,10 +165,10 @@ runGenesisKeyGenUTxO (VerificationKeyFile vkeyPath)
(SigningKeyFile skeyPath) = do
skey <- liftIO $ generateSigningKey AsGenesisUTxOKey
let vkey = getVerificationKey skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope skeyPath (Just skeyDesc) skey
firstExceptT ShelleyGenesisCmdWriteFileError
firstExceptT GenesisFileError
. newExceptT
$ writeFileTextEnvelope vkeyPath (Just vkeyDesc) vkey
where
Expand All @@ -190,7 +179,7 @@ runGenesisKeyGenUTxO (VerificationKeyFile vkeyPath)

runGenesisKeyHash :: VerificationKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyHash (VerificationKeyFile vkeyPath) = do
vkey <- firstExceptT ShelleyGenesisCmdReadFileError . newExceptT $
vkey <- firstExceptT TextEnvReadFileError . newExceptT $
readFileTextEnvelopeAnyOf
[ FromSomeType (AsVerificationKey AsGenesisKey)
AGenesisKey
Expand All @@ -215,7 +204,7 @@ runGenesisKeyHash (VerificationKeyFile vkeyPath) = do
runGenesisVerKey :: VerificationKeyFile -> SigningKeyFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisVerKey (VerificationKeyFile vkeyPath) (SigningKeyFile skeyPath) = do
skey <- firstExceptT ShelleyGenesisCmdReadFileError . newExceptT $
skey <- firstExceptT TextEnvReadFileError . newExceptT $
readFileTextEnvelopeAnyOf
[ FromSomeType (AsSigningKey AsGenesisKey)
AGenesisKey
Expand All @@ -232,7 +221,7 @@ runGenesisVerKey (VerificationKeyFile vkeyPath) (SigningKeyFile skeyPath) = do
AGenesisDelegateKey sk -> AGenesisDelegateKey (getVerificationKey sk)
AGenesisUTxOKey sk -> AGenesisUTxOKey (getVerificationKey sk)

firstExceptT ShelleyGenesisCmdWriteFileError . newExceptT . liftIO $
firstExceptT GenesisFileError . newExceptT . liftIO $
case vkey of
AGenesisKey vk -> writeFileTextEnvelope vkeyPath Nothing vk
AGenesisDelegateKey vk -> writeFileTextEnvelope vkeyPath Nothing vk
Expand All @@ -247,7 +236,7 @@ data SomeGenesisKey f
runGenesisTxIn :: VerificationKeyFile -> NetworkId -> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisTxIn (VerificationKeyFile vkeyPath) network mOutFile = do
vkey <- firstExceptT ShelleyGenesisCmdReadFileError . newExceptT $
vkey <- firstExceptT TextEnvReadFileError . newExceptT $
readFileTextEnvelope (AsVerificationKey AsGenesisUTxOKey) vkeyPath
let txin = genesisUTxOPseudoTxIn network (verificationKeyHash vkey)
liftIO $ writeOutput mOutFile (renderTxIn txin)
Expand All @@ -256,7 +245,7 @@ runGenesisTxIn (VerificationKeyFile vkeyPath) network mOutFile = do
runGenesisAddr :: VerificationKeyFile -> NetworkId -> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisAddr (VerificationKeyFile vkeyPath) network mOutFile = do
vkey <- firstExceptT ShelleyGenesisCmdReadFileError . newExceptT $
vkey <- firstExceptT TextEnvReadFileError . newExceptT $
readFileTextEnvelope (AsVerificationKey AsGenesisUTxOKey) vkeyPath
let vkh = verificationKeyHash (castVerificationKey vkey)
addr = makeShelleyAddress network (PaymentCredentialByKey vkh)
Expand Down Expand Up @@ -355,20 +344,20 @@ readShelleyGenesis fpath = do
readAndDecode
`catchError` \err ->
case err of
ShelleyGenesisCmdReadGenesisIOError _ ioe
GenesisFileError (FileIOError _ ioe)
| isDoesNotExistError ioe -> writeDefault
_ -> left err
where
readAndDecode = do
lbs <- handleIOExceptT (ShelleyGenesisCmdReadGenesisIOError fpath) $ LBS.readFile fpath
firstExceptT (ShelleyGenesisCmdReadGenesisAesonDecodeError fpath . Text.pack)
lbs <- handleIOExceptT (GenesisFileError . FileIOError fpath) $ LBS.readFile fpath
firstExceptT (AesonDecodeError fpath . Text.pack)
. hoistEither $ Aeson.eitherDecode' lbs

defaults :: ShelleyGenesis TPraosStandardCrypto
defaults = shelleyGenesisDefaults

writeDefault = do
handleIOExceptT (ShelleyGenesisCmdWriteDefaultGenesisIOError fpath) $
handleIOExceptT (GenesisFileError . FileIOError fpath) $
LBS.writeFile fpath (encodePretty defaults)
return defaults

Expand Down Expand Up @@ -418,7 +407,7 @@ updateTemplate (SystemStart start) mAmount delKeys utxoAddrs template =

writeShelleyGenesis :: FilePath -> ShelleyGenesis TPraosStandardCrypto -> ExceptT ShelleyGenesisCmdError IO ()
writeShelleyGenesis fpath sg =
handleIOExceptT (ShelleyGenesisCmdWriteGenesisIOError fpath) $ LBS.writeFile fpath (encodePretty sg)
handleIOExceptT (GenesisFileError . FileIOError fpath) $ LBS.writeFile fpath (encodePretty sg)

toShelleyAddr :: Address Shelley -> Ledger.Addr TPraosStandardCrypto
toShelleyAddr (ByronAddress addr) = Ledger.AddrBootstrap
Expand Down Expand Up @@ -477,7 +466,7 @@ readGenesisKeys gendir = do
fileIxs <- extractFileNameIndexes [ gendir </> file
| file <- files
, takeExtension file == ".vkey" ]
firstExceptT ShelleyGenesisCmdReadFileError $
firstExceptT TextEnvReadFileError $
Map.fromList <$>
sequence
[ (,) ix <$> readKeyFile file
Expand All @@ -494,7 +483,7 @@ readDelegateKeys deldir = do
fileIxs <- extractFileNameIndexes [ deldir </> file
| file <- files
, takeExtensions file == ".vkey" ]
firstExceptT ShelleyGenesisCmdReadFileError $
firstExceptT TextEnvReadFileError $
Map.fromList <$>
sequence
[ (,) ix <$> readKeyFile file
Expand All @@ -510,7 +499,7 @@ readDelegateVrfKeys deldir = do
fileIxs <- extractFileNameIndexes [ deldir </> file
| file <- files
, takeExtensions file == ".vrf.vkey" ]
firstExceptT ShelleyGenesisCmdReadFileError $
firstExceptT TextEnvReadFileError $
Map.fromList <$>
sequence
[ (,) ix <$> readKeyFile file
Expand Down Expand Up @@ -550,7 +539,7 @@ readInitialFundAddresses :: FilePath -> NetworkId
-> ExceptT ShelleyGenesisCmdError IO [Address Shelley]
readInitialFundAddresses utxodir nw = do
files <- liftIO (listDirectory utxodir)
vkeys <- firstExceptT ShelleyGenesisCmdReadFileError $
vkeys <- firstExceptT TextEnvReadFileError $
sequence
[ newExceptT $
readFileTextEnvelope (AsVerificationKey AsGenesisUTxOKey)
Expand All @@ -570,7 +559,7 @@ readInitialFundAddresses utxodir nw = do

runGenesisHashFile :: GenesisFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisHashFile (GenesisFile fpath) = do
content <- handleIOExceptT (ShelleyGenesisCmdReadGenesisIOError fpath) $
content <- handleIOExceptT (GenesisFileError . FileIOError fpath) $
BS.readFile fpath
let gh :: Crypto.Hash Crypto.Blake2b_256 ByteString
gh = Crypto.hashWith id content
Expand Down
16 changes: 8 additions & 8 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Governance.hs
Expand Up @@ -21,8 +21,8 @@ import qualified Shelley.Spec.Ledger.TxData as Shelley


data ShelleyGovernanceError
= GovernanceReadFileError !(FileError TextEnvelopeError)
| GovernanceWriteFileError !(FileError ())
= TextEnvReadError !(FileError TextEnvelopeError)
| TextEnvWriteError !(FileError ())
| GovernanceEmptyUpdateProposalError
| GovernanceMIRCertificateKeyRewardMistmach
!FilePath
Expand All @@ -35,8 +35,8 @@ data ShelleyGovernanceError
renderShelleyGovernanceError :: ShelleyGovernanceError -> Text
renderShelleyGovernanceError err =
case err of
GovernanceReadFileError fileErr -> Text.pack (displayError fileErr)
GovernanceWriteFileError fileErr -> Text.pack (displayError fileErr)
TextEnvReadError fileErr -> Text.pack (displayError fileErr)
TextEnvWriteError fileErr -> Text.pack (displayError fileErr)
-- TODO: The equality check is still not working for empty update proposals.
GovernanceEmptyUpdateProposalError ->
"Empty update proposals are not allowed"
Expand Down Expand Up @@ -67,7 +67,7 @@ runGovernanceMIRCertificate mirPot vKeys rwdAmts (OutputFile oFp) = do

let mirCert = makeMIRCertificate mirPot (zip sCreds rwdAmts)

firstExceptT GovernanceWriteFileError
firstExceptT TextEnvWriteError
. newExceptT
$ writeFileTextEnvelope oFp (Just mirCertDesc) mirCert
where
Expand All @@ -83,7 +83,7 @@ runGovernanceMIRCertificate mirPot vKeys rwdAmts (OutputFile oFp) = do

readStakeKeyToCred :: VerificationKeyFile -> ExceptT ShelleyGovernanceError IO StakeCredential
readStakeKeyToCred (VerificationKeyFile stVKey) = do
stakeVkey <- firstExceptT GovernanceReadFileError
stakeVkey <- firstExceptT TextEnvReadError
. newExceptT
$ readFileTextEnvelope (AsVerificationKey AsStakeKey) stVKey
right . StakeCredentialByKey $ verificationKeyHash stakeVkey
Expand All @@ -98,12 +98,12 @@ runGovernanceUpdateProposal
runGovernanceUpdateProposal (OutputFile upFile) eNo genVerKeyFiles upPprams = do
when (upPprams == mempty) $ left GovernanceEmptyUpdateProposalError
genVKeys <- sequence
[ firstExceptT GovernanceReadFileError . newExceptT $
[ firstExceptT TextEnvReadError . newExceptT $
readFileTextEnvelope
(AsVerificationKey AsGenesisKey)
vkeyFile
| VerificationKeyFile vkeyFile <- genVerKeyFiles ]
let genKeyHashes = map verificationKeyHash genVKeys
upProp = makeShelleyUpdateProposal upPprams genKeyHashes eNo
firstExceptT GovernanceWriteFileError . newExceptT $
firstExceptT TextEnvWriteError . newExceptT $
writeFileTextEnvelope upFile Nothing upProp

0 comments on commit aaddfda

Please sign in to comment.