11{-# LANGUAGE DataKinds #-}
2+ {-# LANGUAGE DeriveAnyClass #-}
23{-# LANGUAGE DeriveGeneric #-}
4+ {-# LANGUAGE DerivingStrategies #-}
5+ {-# LANGUAGE LambdaCase #-}
36{-# LANGUAGE MultiParamTypeClasses #-}
47{-# LANGUAGE OverloadedStrings #-}
8+ {-# LANGUAGE StandaloneDeriving #-}
59{-# LANGUAGE TypeOperators #-}
610
711module Cardano.TxSubmit.Types
@@ -12,36 +16,38 @@ module Cardano.TxSubmit.Types
1216 , EnvSocketError (.. )
1317 , TxCmdError (.. )
1418 , RawCborDecodeError (.. )
15- , renderTxSubmitWebApiError
1619 , renderTxCmdError
1720 ) where
1821
19- import Cardano.Api (Error (.. ), TxId , textShow )
22+ import Cardano.Api (Error (.. ), TxId , TxValidationErrorInCardanoMode ( .. ), textShow )
2023import Cardano.Api.Pretty
2124import Cardano.Binary (DecoderError )
22- import Data.Aeson (ToJSON (.. ), Value (.. ))
25+ import Cardano.TxSubmit.Orphans ()
26+ import Data.Aeson (ToJSON (.. ), Value (.. ), (.=) )
27+ import qualified Data.Aeson as Aeson
2328import Data.ByteString.Char8 (ByteString )
2429import Data.Text (Text )
25- import Formatting (build , sformat )
2630import GHC.Generics (Generic )
2731import Network.HTTP.Media ((//) )
28- import Ouroboros.Consensus.Cardano.Block (EraMismatch (.. ))
2932import Servant (Accept (.. ), JSON , MimeRender (.. ), MimeUnrender (.. ), PostAccepted ,
3033 ReqBody , (:>) )
3134import Servant.API.Generic (ToServantApi , (:-) )
3235
3336import qualified Data.ByteString.Lazy.Char8 as LBS
37+ import qualified Data.Text as T
3438
3539newtype TxSubmitPort = TxSubmitPort Int
3640
3741-- | The errors that the raw CBOR transaction parsing\/decoding functions can return.
3842--
3943newtype RawCborDecodeError = RawCborDecodeError [DecoderError ]
40- deriving (Eq , Show )
44+ deriving (Eq , Generic , Show )
4145
4246instance Error RawCborDecodeError where
4347 prettyError (RawCborDecodeError decodeErrors) = " RawCborDecodeError decode error: " <> pshow (fmap pshow decodeErrors)
4448
49+ deriving anyclass instance ToJSON RawCborDecodeError
50+
4551-- | An error that can occur in the transaction submission web API.
4652data TxSubmitWebApiError
4753 = TxSubmitDecodeHex
@@ -50,34 +56,56 @@ data TxSubmitWebApiError
5056 | TxSubmitBadTx ! Text
5157 | TxSubmitFail TxCmdError
5258
53- newtype EnvSocketError = CliEnvVarLookup Text deriving (Eq , Show )
59+ deriving instance Generic TxSubmitWebApiError
60+
61+ instance ToJSON TxSubmitWebApiError where
62+ toJSON = \ case
63+ TxSubmitDecodeHex -> Aeson. object
64+ [ " tag" .= String " TxSubmitDecodeHex"
65+ ]
66+ TxSubmitEmpty -> Aeson. object
67+ [ " tag" .= String " TxSubmitEmpty"
68+ ]
69+ TxSubmitDecodeFail err -> Aeson. object
70+ [ " tag" .= String " TxSubmitDecodeFail"
71+ , " contents" .= toJSON err
72+ ]
73+ TxSubmitBadTx err -> Aeson. object
74+ [ " tag" .= String " TxSubmitBadTx"
75+ , " contents" .= toJSON err
76+ ]
77+ TxSubmitFail err -> Aeson. object
78+ [ " tag" .= String " TxSubmitFail"
79+ , " contents" .= toJSON err
80+ ]
81+
82+ newtype EnvSocketError = CliEnvVarLookup Text
83+ deriving (Eq , Generic , Show )
84+
85+ instance ToJSON EnvSocketError where
86+ toJSON (CliEnvVarLookup msg) = Aeson. object
87+ [ " message" .= String msg
88+ ]
5489
5590data TxCmdError
5691 = TxCmdSocketEnvError EnvSocketError
5792 | TxCmdTxReadError ! RawCborDecodeError
58- | TxCmdTxSubmitError ! Text
59- | TxCmdTxSubmitErrorEraMismatch ! EraMismatch
93+ | TxCmdTxSubmitValidationError ! TxValidationErrorInCardanoMode
6094
61- instance ToJSON TxSubmitWebApiError where
62- toJSON = convertJson
95+ deriving instance Generic TxCmdError
6396
64- convertJson :: TxSubmitWebApiError -> Value
65- convertJson = String . renderTxSubmitWebApiError
97+ deriving anyclass instance ToJSON TxCmdError
6698
6799renderTxCmdError :: TxCmdError -> Text
68- renderTxCmdError (TxCmdSocketEnvError socketError) = " socket env error " <> textShow socketError
69- renderTxCmdError (TxCmdTxReadError envelopeError) = " transaction read error " <> textShow envelopeError
70- renderTxCmdError (TxCmdTxSubmitError msg) = " transaction submit error " <> msg
71- renderTxCmdError (TxCmdTxSubmitErrorEraMismatch eraMismatch) = " transaction submit era mismatch" <> textShow eraMismatch
72-
73- renderTxSubmitWebApiError :: TxSubmitWebApiError -> Text
74- renderTxSubmitWebApiError st =
75- case st of
76- TxSubmitDecodeHex -> " Provided data was hex encoded and this webapi expects raw binary"
77- TxSubmitEmpty -> " Provided transaction has zero length"
78- TxSubmitDecodeFail err -> sformat build err
79- TxSubmitBadTx tt -> mconcat [" Transactions of type '" , tt, " ' not supported" ]
80- TxSubmitFail err -> renderTxCmdError err
100+ renderTxCmdError = \ case
101+ TxCmdSocketEnvError socketError ->
102+ " socket env error " <> textShow socketError
103+ TxCmdTxReadError envelopeError ->
104+ " transaction read error " <> textShow envelopeError
105+ TxCmdTxSubmitValidationError e ->
106+ case e of
107+ TxValidationErrorInCardanoMode err -> " transaction submit error " <> T. pack (show err)
108+ TxValidationEraMismatch eraMismatch -> " transaction submit era mismatch" <> textShow eraMismatch
81109
82110-- | Servant API which provides access to tx submission webapi
83111type TxSubmitApi = " api" :> ToServantApi TxSubmitApiRecord
0 commit comments