From d20e9eb7314f29d724e1aed674bb01aecaf0b940 Mon Sep 17 00:00:00 2001 From: Duncan Coutts Date: Fri, 8 Jan 2021 12:14:20 +0000 Subject: [PATCH 1/2] Add SerialiseAsRawBytes instances for PolicyId and AssetName Plus handy Show/IsString instances. --- cardano-api/src/Cardano/Api/Value.hs | 45 ++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/cardano-api/src/Cardano/Api/Value.hs b/cardano-api/src/Cardano/Api/Value.hs index 55b5db6b2a7..d2ac26a3e7f 100644 --- a/cardano-api/src/Cardano/Api/Value.hs +++ b/cardano-api/src/Cardano/Api/Value.hs @@ -1,8 +1,10 @@ {-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE DerivingVia #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeFamilies #-} -- | Currency values -- @@ -40,6 +42,9 @@ module Cardano.Api.Value , fromShelleyLovelace , toMaryValue , fromMaryValue + + -- * Data family instances + , AsType(..) ) where import Prelude @@ -48,11 +53,13 @@ import Data.Aeson hiding (Value) import qualified Data.Aeson as Aeson import Data.Aeson.Types (Parser, toJSONKeyText) import Data.ByteString (ByteString) +import qualified Data.ByteString as BS +import qualified Data.ByteString.Char8 as BSC import qualified Data.HashMap.Strict as HashMap import qualified Data.Map.Merge.Strict as Map import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map -import Data.String (IsString) +import Data.String (IsString(..)) import Data.Text (Text) import qualified Data.Text as Text import qualified Data.Text.Encoding as Text @@ -64,8 +71,9 @@ import qualified Cardano.Ledger.Mary.Value as Mary import Ouroboros.Consensus.Shelley.Protocol.Crypto (StandardCrypto) +import Cardano.Api.HasTypeProxy import Cardano.Api.Script -import Cardano.Api.SerialiseRaw (deserialiseFromRawBytesHex, serialiseToRawBytesHex) +import Cardano.Api.SerialiseRaw -- ---------------------------------------------------------------------------- @@ -118,12 +126,37 @@ quantityToLovelace (Quantity x) = Lovelace x newtype PolicyId = PolicyId ScriptHash - deriving stock (Show) - deriving newtype (Eq, Ord, IsString) + deriving stock (Eq, Ord) + deriving (Show, IsString) via UsingRawBytesHex PolicyId + +instance HasTypeProxy PolicyId where + data AsType PolicyId = AsPolicyId + proxyToAsType _ = AsPolicyId + +instance SerialiseAsRawBytes PolicyId where + serialiseToRawBytes (PolicyId sh) = serialiseToRawBytes sh + deserialiseFromRawBytes AsPolicyId bs = + PolicyId <$> deserialiseFromRawBytes AsScriptHash bs newtype AssetName = AssetName ByteString - deriving stock (Show) - deriving newtype (Eq, Ord, IsString) + deriving stock (Eq, Ord) + deriving newtype (Show) + +instance IsString AssetName where + fromString s + | let bs = Text.encodeUtf8 (Text.pack s) + , BS.length bs <= 32 = AssetName (BSC.pack s) + | otherwise = error "fromString: AssetName over 32 bytes" + +instance HasTypeProxy AssetName where + data AsType AssetName = AsAssetName + proxyToAsType _ = AsAssetName + +instance SerialiseAsRawBytes AssetName where + serialiseToRawBytes (AssetName bs) = bs + deserialiseFromRawBytes AsAssetName bs + | BS.length bs <= 32 = Just (AssetName bs) + | otherwise = Nothing instance ToJSON AssetName where toJSON (AssetName an) = Aeson.String $ Text.decodeUtf8 an From 4405c988cb0aa55929de9d7e7c4b6dcdc17b657a Mon Sep 17 00:00:00 2001 From: Rodney Lorrimar Date: Sat, 9 Jan 2021 06:13:05 +0800 Subject: [PATCH 2/2] Fix HLint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DerivingVia ⇒ DerivingStrategies --- cardano-api/src/Cardano/Api/Value.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/cardano-api/src/Cardano/Api/Value.hs b/cardano-api/src/Cardano/Api/Value.hs index d2ac26a3e7f..45c2cb62fb5 100644 --- a/cardano-api/src/Cardano/Api/Value.hs +++ b/cardano-api/src/Cardano/Api/Value.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}