Skip to content

Commit

Permalink
Make more use of deriving via UsingRawBytes{Hex}
Browse files Browse the repository at this point in the history
And other minor related tidy ups of the deriving instances.
  • Loading branch information
dcoutts committed Jun 8, 2021
1 parent 711cfa0 commit 6a5a994
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 49 deletions.
31 changes: 19 additions & 12 deletions cardano-api/src/Cardano/Api/ProtocolParameters.hs
@@ -1,5 +1,6 @@
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
Expand Down Expand Up @@ -56,17 +57,16 @@ import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy.Char8 as LBS
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.String (IsString)
import Data.Scientific (Scientific)
import Data.Text (Text)
import qualified Data.Text as Text
import GHC.Generics
import Numeric.Natural

import Control.Monad

import Data.Aeson (FromJSON (..), ToJSON (..), object, withObject,
withText, (.!=), (.:), (.:?), (.=))
import qualified Data.Aeson as Aeson
(.!=), (.:), (.:?), (.=))
import Data.Bifunctor (bimap)

import qualified Cardano.Binary as CBOR
Expand Down Expand Up @@ -103,7 +103,9 @@ import Cardano.Api.KeysByron
import Cardano.Api.KeysShelley
import Cardano.Api.Script
import Cardano.Api.SerialiseCBOR
import Cardano.Api.SerialiseRaw
import Cardano.Api.SerialiseTextEnvelope
import Cardano.Api.SerialiseUsing
import Cardano.Api.StakePoolMetadata
import Cardano.Api.TxMetadata
import Cardano.Api.Value
Expand Down Expand Up @@ -580,17 +582,22 @@ instance Monoid ProtocolParametersUpdate where
--

newtype PraosNonce = PraosNonce (Ledger.Hash StandardCrypto ByteString)
deriving (Eq, Ord, Show, Generic)
deriving stock (Eq, Ord, Generic)
deriving (Show, IsString) via UsingRawBytesHex PraosNonce
deriving (ToJSON, FromJSON) via UsingRawBytesHex PraosNonce
deriving (ToCBOR, FromCBOR) via UsingRawBytes PraosNonce

instance ToJSON PraosNonce where
toJSON (PraosNonce h) =
Aeson.String $ Crypto.hashToTextAsHex h
instance HasTypeProxy PraosNonce where
data AsType PraosNonce = AsPraosNonce
proxyToAsType _ = AsPraosNonce

instance SerialiseAsRawBytes PraosNonce where
serialiseToRawBytes (PraosNonce h) =
Crypto.hashToBytes h

deserialiseFromRawBytes AsPraosNonce bs =
PraosNonce <$> Crypto.hashFromBytes bs

instance FromJSON PraosNonce where
parseJSON = withText "PraosNonce" $ \h ->
case Crypto.hashFromTextAsHex h of
Nothing -> fail $ "Failed to decode PraosNonce: " <> Text.unpack h
Just nonce -> return $ PraosNonce nonce

makePraosNonce :: ByteString -> PraosNonce
makePraosNonce = PraosNonce . Crypto.hashWith id
Expand Down
23 changes: 9 additions & 14 deletions cardano-api/src/Cardano/Api/Script.hs
@@ -1,3 +1,4 @@
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
Expand Down Expand Up @@ -779,7 +780,8 @@ fromAlonzoExUnits Alonzo.ExUnits{Alonzo.exUnitsSteps, Alonzo.exUnitsMem} =
--
newtype ScriptHash = ScriptHash (Shelley.ScriptHash StandardCrypto)
deriving stock (Eq, Ord)
deriving (Show, IsString) via UsingRawBytesHex ScriptHash
deriving (Show, IsString) via UsingRawBytesHex ScriptHash
deriving (ToJSON, FromJSON) via UsingRawBytesHex ScriptHash

instance HasTypeProxy ScriptHash where
data AsType ScriptHash = AsScriptHash
Expand Down Expand Up @@ -910,9 +912,12 @@ adjustSimpleScriptVersion target = go
--
data PlutusScript lang where
PlutusScriptSerialised :: ShortByteString -> PlutusScript lang

deriving instance Eq (PlutusScript lang)
deriving instance Show (PlutusScript lang)
deriving stock (Eq, Ord)
deriving stock (Show) -- TODO: would be nice to use via UsingRawBytesHex
-- however that adds an awkward HasTypeProxy lang =>
-- constraint to other Show instances elsewhere
deriving (ToCBOR, FromCBOR) via (UsingRawBytes (PlutusScript lang))
deriving anyclass SerialiseAsCBOR

instance HasTypeProxy lang => HasTypeProxy (PlutusScript lang) where
data AsType (PlutusScript lang) = AsPlutusScript (AsType lang)
Expand All @@ -925,16 +930,6 @@ instance HasTypeProxy lang => SerialiseAsRawBytes (PlutusScript lang) where
-- TODO alonzo: validate the script syntax and fail decoding if invalid
Just (PlutusScriptSerialised (SBS.toShort bs))

instance Typeable lang => ToCBOR (PlutusScript lang) where
toCBOR (PlutusScriptSerialised sbs) = toCBOR sbs

instance Typeable lang => FromCBOR (PlutusScript lang) where
-- TODO alonzo: validate the script syntax and fail decoding if invalid
fromCBOR = PlutusScriptSerialised <$> fromCBOR

instance (HasTypeProxy lang, Typeable lang) =>
SerialiseAsCBOR (PlutusScript lang)

instance (IsPlutusScriptLanguage lang, Typeable lang) =>
HasTextEnvelope (PlutusScript lang) where
textEnvelopeType _ =
Expand Down
11 changes: 3 additions & 8 deletions cardano-api/src/Cardano/Api/ScriptData.hs
Expand Up @@ -51,7 +51,6 @@ import qualified Data.Vector as Vector

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Text as Aeson.Text
import qualified Data.Aeson.Types as Aeson
import qualified Data.Attoparsec.ByteString.Char8 as Atto

import Control.Applicative (Alternative (..))
Expand Down Expand Up @@ -99,7 +98,9 @@ instance HasTypeProxy ScriptData where
newtype instance Hash ScriptData =
ScriptDataHash (Alonzo.DataHash StandardCrypto)
deriving stock (Eq, Ord)
deriving (Show, IsString) via UsingRawBytesHex (Hash ScriptData)
deriving (Show, IsString) via UsingRawBytesHex (Hash ScriptData)
deriving (ToJSON, FromJSON) via UsingRawBytesHex (Hash ScriptData)
deriving (ToJSONKey, FromJSONKey) via UsingRawBytesHex (Hash ScriptData)

instance SerialiseAsRawBytes (Hash ScriptData) where
serialiseToRawBytes (ScriptDataHash dh) =
Expand All @@ -108,12 +109,6 @@ instance SerialiseAsRawBytes (Hash ScriptData) where
deserialiseFromRawBytes (AsHash AsScriptData) bs =
ScriptDataHash . Ledger.unsafeMakeSafeHash <$> Crypto.hashFromBytes bs

instance ToJSON (Hash ScriptData) where
toJSON = toJSON . serialiseToRawBytesHexText

instance Aeson.ToJSONKey (Hash ScriptData) where
toJSONKey = Aeson.toJSONKeyText serialiseToRawBytesHexText


-- ----------------------------------------------------------------------------
-- Conversion functions
Expand Down
4 changes: 3 additions & 1 deletion cardano-api/src/Cardano/Api/SerialiseJSON.hs
Expand Up @@ -4,9 +4,11 @@
module Cardano.Api.SerialiseJSON
( serialiseToJSON
, ToJSON(..)
, ToJSONKey
, deserialiseFromJSON
, prettyPrintJSON
, FromJSON(..)
, FromJSONKey
, JsonDecodeError(..)
, readFileJSON
, writeFileJSON
Expand All @@ -16,7 +18,7 @@ import Prelude

import Control.Monad.Trans.Except (runExceptT)
import Control.Monad.Trans.Except.Extra (firstExceptT, handleIOExceptT, hoistEither)
import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Aeson (FromJSON (..), ToJSON (..), ToJSONKey, FromJSONKey)
import qualified Data.Aeson as Aeson
import Data.Aeson.Encode.Pretty (encodePretty)
import Data.ByteString (ByteString)
Expand Down
1 change: 0 additions & 1 deletion cardano-api/src/Cardano/Api/SerialiseUsing.hs
Expand Up @@ -17,7 +17,6 @@ import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import Data.Typeable

import Data.Aeson (ToJSONKey(..), FromJSONKey(..))
import qualified Data.Aeson.Types as Aeson

import Cardano.Api.Error
Expand Down
25 changes: 13 additions & 12 deletions cardano-api/src/Cardano/Api/TxBody.hs
@@ -1,6 +1,7 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE FlexibleContexts #-}
Expand Down Expand Up @@ -112,7 +113,7 @@ module Cardano.Api.TxBody (
import Prelude

import Control.Monad (guard)
import Data.Aeson (ToJSON (..), object, (.=))
import Data.Aeson (object, (.=))
import qualified Data.Aeson as Aeson
import Data.Aeson.Types (ToJSONKey (..), toJSONKeyText)
import Data.Bifunctor (first)
Expand Down Expand Up @@ -190,8 +191,10 @@ import Cardano.Api.ProtocolParameters
import Cardano.Api.Script
import Cardano.Api.SerialiseBech32
import Cardano.Api.SerialiseCBOR
import Cardano.Api.SerialiseJSON
import Cardano.Api.SerialiseRaw
import Cardano.Api.SerialiseTextEnvelope
import Cardano.Api.SerialiseUsing
import Cardano.Api.TxMetadata
import Cardano.Api.Utils
import Cardano.Api.Value
Expand All @@ -206,12 +209,11 @@ import Cardano.Ledger.Crypto (StandardCrypto)
--

newtype TxId = TxId (Shelley.Hash StandardCrypto Shelley.EraIndependentTxBody)
deriving stock (Eq, Ord, Show)
deriving newtype (IsString)
-- We use the Shelley representation and convert the Byron one

instance ToJSON TxId where
toJSON = Aeson.String . serialiseToRawBytesHexText
-- We use the Shelley representation and convert to/from the Byron one
deriving stock (Eq, Ord)
deriving (Show, IsString) via UsingRawBytesHex TxId
deriving (ToJSON, FromJSON) via UsingRawBytesHex TxId
deriving (ToJSONKey, FromJSONKey) via UsingRawBytesHex TxId

instance HasTypeProxy TxId where
data AsType TxId = AsTxId
Expand Down Expand Up @@ -285,7 +287,7 @@ renderTxIn (TxIn txId (TxIx ix)) =
newtype TxIx = TxIx Word
deriving stock (Eq, Ord, Show)
deriving newtype (Enum)
deriving newtype ToJSON
deriving newtype (ToJSON, FromJSON)

fromByronTxIn :: Byron.TxIn -> TxIn
fromByronTxIn (Byron.TxInUtxo txId index) =
Expand Down Expand Up @@ -317,6 +319,9 @@ data TxOut era = TxOut (AddressInEra era)
(TxOutDatumHash era)
deriving Generic

deriving instance Eq (TxOut era)
deriving instance Show (TxOut era)

instance IsCardanoEra era => ToJSON (TxOut era) where
toJSON (TxOut addr val TxOutDatumHashNone) =
object [ "address" .= serialiseAddressForTxOut addr
Expand All @@ -335,10 +340,6 @@ serialiseAddressForTxOut (AddressInEra addrType addr) =
ShelleyAddressInEra _ -> serialiseToBech32 addr


deriving instance Eq (TxOut era)
deriving instance Show (TxOut era)


fromByronTxOut :: Byron.TxOut -> TxOut ByronEra
fromByronTxOut (Byron.TxOut addr value) =
TxOut
Expand Down
2 changes: 1 addition & 1 deletion cardano-api/src/Cardano/Api/Value.hs
Expand Up @@ -137,7 +137,7 @@ quantityToLovelace (Quantity x) = Lovelace x

newtype PolicyId = PolicyId ScriptHash
deriving stock (Eq, Ord)
deriving (Show, IsString) via UsingRawBytesHex PolicyId
deriving (Show, IsString, ToJSON, FromJSON) via UsingRawBytesHex PolicyId

instance HasTypeProxy PolicyId where
data AsType PolicyId = AsPolicyId
Expand Down

0 comments on commit 6a5a994

Please sign in to comment.