{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
module Cardano.CLI.EraBased.Script.Read.Common
(
readScriptDataOrFile
, readScriptRedeemerOrFile
, readFilePlutusScript
, readFileSimpleScript
)
where
import Cardano.Api as Api
import Cardano.CLI.EraBased.Script.Type
import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Error.PlutusScriptDecodeError
import Cardano.CLI.Type.Error.ScriptDataError
import Cardano.CLI.Type.Error.ScriptDecodeError
import Prelude
import Data.Aeson qualified as Aeson
import Data.Bifunctor
import Data.ByteString qualified as BS
import Data.ByteString.Lazy.Char8 qualified as LBS
import Data.Text qualified as Text
deserialisePlutusScript
:: BS.ByteString
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialisePlutusScript :: ByteString -> Either PlutusScriptDecodeError AnyPlutusScript
deserialisePlutusScript ByteString
bs = do
TextEnvelope
te <- (JsonDecodeError -> PlutusScriptDecodeError)
-> Either JsonDecodeError TextEnvelope
-> Either PlutusScriptDecodeError TextEnvelope
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first JsonDecodeError -> PlutusScriptDecodeError
PlutusScriptJsonDecodeError (Either JsonDecodeError TextEnvelope
-> Either PlutusScriptDecodeError TextEnvelope)
-> Either JsonDecodeError TextEnvelope
-> Either PlutusScriptDecodeError TextEnvelope
forall a b. (a -> b) -> a -> b
$ AsType TextEnvelope
-> ByteString -> Either JsonDecodeError TextEnvelope
forall a.
FromJSON a =>
AsType a -> ByteString -> Either JsonDecodeError a
deserialiseFromJSON AsType TextEnvelope
AsTextEnvelope ByteString
bs
case TextEnvelope -> TextEnvelopeType
teType TextEnvelope
te of
TextEnvelopeType String
s -> case String
s of
sVer :: String
sVer@String
"PlutusScriptV1" -> String
-> PlutusScriptVersion PlutusScriptV1
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion String
sVer PlutusScriptVersion PlutusScriptV1
PlutusScriptV1 TextEnvelope
te
sVer :: String
sVer@String
"PlutusScriptV2" -> String
-> PlutusScriptVersion PlutusScriptV2
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion String
sVer PlutusScriptVersion PlutusScriptV2
PlutusScriptV2 TextEnvelope
te
sVer :: String
sVer@String
"PlutusScriptV3" -> String
-> PlutusScriptVersion PlutusScriptV3
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion String
sVer PlutusScriptVersion PlutusScriptV3
PlutusScriptV3 TextEnvelope
te
String
unknownScriptVersion ->
PlutusScriptDecodeError
-> Either PlutusScriptDecodeError AnyPlutusScript
forall a b. a -> Either a b
Left (PlutusScriptDecodeError
-> Either PlutusScriptDecodeError AnyPlutusScript)
-> (Text -> PlutusScriptDecodeError)
-> Text
-> Either PlutusScriptDecodeError AnyPlutusScript
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> PlutusScriptDecodeError
PlutusScriptDecodeErrorUnknownVersion (Text -> Either PlutusScriptDecodeError AnyPlutusScript)
-> Text -> Either PlutusScriptDecodeError AnyPlutusScript
forall a b. (a -> b) -> a -> b
$ String -> Text
Text.pack String
unknownScriptVersion
where
deserialiseAnyPlutusScriptVersion
:: IsPlutusScriptLanguage lang
=> String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion :: forall lang.
IsPlutusScriptLanguage lang =>
String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion String
v PlutusScriptVersion lang
lang TextEnvelope
tEnv =
if String
v String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== PlutusScriptVersion lang -> String
forall a. Show a => a -> String
show PlutusScriptVersion lang
lang
then
(TextEnvelopeError -> PlutusScriptDecodeError)
-> Either TextEnvelopeError AnyPlutusScript
-> Either PlutusScriptDecodeError AnyPlutusScript
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first TextEnvelopeError -> PlutusScriptDecodeError
PlutusScriptDecodeTextEnvelopeError (Either TextEnvelopeError AnyPlutusScript
-> Either PlutusScriptDecodeError AnyPlutusScript)
-> Either TextEnvelopeError AnyPlutusScript
-> Either PlutusScriptDecodeError AnyPlutusScript
forall a b. (a -> b) -> a -> b
$
[FromSomeType HasTextEnvelope AnyPlutusScript]
-> TextEnvelope -> Either TextEnvelopeError AnyPlutusScript
forall b.
[FromSomeType HasTextEnvelope b]
-> TextEnvelope -> Either TextEnvelopeError b
deserialiseFromTextEnvelopeAnyOf [AnyPlutusScriptVersion
-> FromSomeType HasTextEnvelope AnyPlutusScript
teTypes (PlutusScriptVersion lang -> AnyPlutusScriptVersion
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> AnyPlutusScriptVersion
AnyPlutusScriptVersion PlutusScriptVersion lang
lang)] TextEnvelope
tEnv
else PlutusScriptDecodeError
-> Either PlutusScriptDecodeError AnyPlutusScript
forall a b. a -> Either a b
Left (PlutusScriptDecodeError
-> Either PlutusScriptDecodeError AnyPlutusScript)
-> PlutusScriptDecodeError
-> Either PlutusScriptDecodeError AnyPlutusScript
forall a b. (a -> b) -> a -> b
$ Text -> AnyPlutusScriptVersion -> PlutusScriptDecodeError
PlutusScriptDecodeErrorVersionMismatch (String -> Text
Text.pack String
v) (PlutusScriptVersion lang -> AnyPlutusScriptVersion
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> AnyPlutusScriptVersion
AnyPlutusScriptVersion PlutusScriptVersion lang
lang)
teTypes :: AnyPlutusScriptVersion -> FromSomeType HasTextEnvelope AnyPlutusScript
teTypes :: AnyPlutusScriptVersion
-> FromSomeType HasTextEnvelope AnyPlutusScript
teTypes =
\case
AnyPlutusScriptVersion PlutusScriptVersion lang
PlutusScriptV1 ->
AsType (PlutusScript PlutusScriptV1)
-> (PlutusScript PlutusScriptV1 -> AnyPlutusScript)
-> FromSomeType HasTextEnvelope AnyPlutusScript
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType PlutusScriptV1 -> AsType (PlutusScript PlutusScriptV1)
forall lang. AsType lang -> AsType (PlutusScript lang)
AsPlutusScript AsType PlutusScriptV1
AsPlutusScriptV1) (PlutusScriptVersion PlutusScriptV1
-> PlutusScript PlutusScriptV1 -> AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> AnyPlutusScript
AnyPlutusScript PlutusScriptVersion PlutusScriptV1
PlutusScriptV1)
AnyPlutusScriptVersion PlutusScriptVersion lang
PlutusScriptV2 ->
AsType (PlutusScript PlutusScriptV2)
-> (PlutusScript PlutusScriptV2 -> AnyPlutusScript)
-> FromSomeType HasTextEnvelope AnyPlutusScript
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType PlutusScriptV2 -> AsType (PlutusScript PlutusScriptV2)
forall lang. AsType lang -> AsType (PlutusScript lang)
AsPlutusScript AsType PlutusScriptV2
AsPlutusScriptV2) (PlutusScriptVersion PlutusScriptV2
-> PlutusScript PlutusScriptV2 -> AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> AnyPlutusScript
AnyPlutusScript PlutusScriptVersion PlutusScriptV2
PlutusScriptV2)
AnyPlutusScriptVersion PlutusScriptVersion lang
PlutusScriptV3 ->
AsType (PlutusScript PlutusScriptV3)
-> (PlutusScript PlutusScriptV3 -> AnyPlutusScript)
-> FromSomeType HasTextEnvelope AnyPlutusScript
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType PlutusScriptV3 -> AsType (PlutusScript PlutusScriptV3)
forall lang. AsType lang -> AsType (PlutusScript lang)
AsPlutusScript AsType PlutusScriptV3
AsPlutusScriptV3) (PlutusScriptVersion PlutusScriptV3
-> PlutusScript PlutusScriptV3 -> AnyPlutusScript
forall lang.
IsPlutusScriptLanguage lang =>
PlutusScriptVersion lang -> PlutusScript lang -> AnyPlutusScript
AnyPlutusScript PlutusScriptVersion PlutusScriptV3
PlutusScriptV3)
deserialiseSimpleScript
:: BS.ByteString
-> Either ScriptDecodeError (Script SimpleScript')
deserialiseSimpleScript :: ByteString -> Either ScriptDecodeError (Script SimpleScript')
deserialiseSimpleScript ByteString
bs =
case AsType TextEnvelope
-> ByteString -> Either JsonDecodeError TextEnvelope
forall a.
FromJSON a =>
AsType a -> ByteString -> Either JsonDecodeError a
deserialiseFromJSON AsType TextEnvelope
AsTextEnvelope ByteString
bs of
Left JsonDecodeError
_ ->
case ByteString -> Either String SimpleScript
forall a. FromJSON a => ByteString -> Either String a
Aeson.eitherDecodeStrict' ByteString
bs of
Left String
err -> ScriptDecodeError
-> Either ScriptDecodeError (Script SimpleScript')
forall a b. a -> Either a b
Left (JsonDecodeError -> ScriptDecodeError
ScriptDecodeSimpleScriptError (JsonDecodeError -> ScriptDecodeError)
-> JsonDecodeError -> ScriptDecodeError
forall a b. (a -> b) -> a -> b
$ String -> JsonDecodeError
JsonDecodeError String
err)
Right SimpleScript
script -> Script SimpleScript'
-> Either ScriptDecodeError (Script SimpleScript')
forall a b. b -> Either a b
Right (Script SimpleScript'
-> Either ScriptDecodeError (Script SimpleScript'))
-> Script SimpleScript'
-> Either ScriptDecodeError (Script SimpleScript')
forall a b. (a -> b) -> a -> b
$ SimpleScript -> Script SimpleScript'
SimpleScript SimpleScript
script
Right TextEnvelope
te ->
case [FromSomeType HasTextEnvelope (Script SimpleScript')]
-> TextEnvelope -> Either TextEnvelopeError (Script SimpleScript')
forall b.
[FromSomeType HasTextEnvelope b]
-> TextEnvelope -> Either TextEnvelopeError b
deserialiseFromTextEnvelopeAnyOf [FromSomeType HasTextEnvelope (Script SimpleScript')
teType'] TextEnvelope
te of
Left TextEnvelopeError
err -> ScriptDecodeError
-> Either ScriptDecodeError (Script SimpleScript')
forall a b. a -> Either a b
Left (TextEnvelopeError -> ScriptDecodeError
ScriptDecodeTextEnvelopeError TextEnvelopeError
err)
Right Script SimpleScript'
script -> Script SimpleScript'
-> Either ScriptDecodeError (Script SimpleScript')
forall a b. b -> Either a b
Right Script SimpleScript'
script
where
teType' :: FromSomeType HasTextEnvelope (Script SimpleScript')
teType' :: FromSomeType HasTextEnvelope (Script SimpleScript')
teType' = AsType (Script SimpleScript')
-> (Script SimpleScript' -> Script SimpleScript')
-> FromSomeType HasTextEnvelope (Script SimpleScript')
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType SimpleScript' -> AsType (Script SimpleScript')
forall lang. AsType lang -> AsType (Script lang)
AsScript AsType SimpleScript'
AsSimpleScript) Script SimpleScript' -> Script SimpleScript'
forall a. a -> a
id
readFilePlutusScript
:: MonadIOTransError (FileError PlutusScriptDecodeError) t m
=> FilePath
-> t m AnyPlutusScript
readFilePlutusScript :: forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError PlutusScriptDecodeError) t m =>
String -> t m AnyPlutusScript
readFilePlutusScript String
plutusScriptFp = do
ByteString
bs <-
(IOException -> FileError PlutusScriptDecodeError)
-> m ByteString -> t m ByteString
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
(MonadIOTransError e' t m, Exception e) =>
(e -> e') -> m a -> t m a
handleIOExceptionsLiftWith (String -> IOException -> FileError PlutusScriptDecodeError
forall e. String -> IOException -> FileError e
FileIOError String
plutusScriptFp) (m ByteString -> t m ByteString)
-> (IO ByteString -> m ByteString)
-> IO ByteString
-> t m ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ByteString -> m ByteString
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ByteString -> t m ByteString)
-> IO ByteString -> t m ByteString
forall a b. (a -> b) -> a -> b
$
String -> IO ByteString
BS.readFile String
plutusScriptFp
(PlutusScriptDecodeError -> FileError PlutusScriptDecodeError)
-> ExceptT PlutusScriptDecodeError m AnyPlutusScript
-> t m AnyPlutusScript
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (String
-> PlutusScriptDecodeError -> FileError PlutusScriptDecodeError
forall e. String -> e -> FileError e
FileError String
plutusScriptFp) (ExceptT PlutusScriptDecodeError m AnyPlutusScript
-> t m AnyPlutusScript)
-> ExceptT PlutusScriptDecodeError m AnyPlutusScript
-> t m AnyPlutusScript
forall a b. (a -> b) -> a -> b
$
Either PlutusScriptDecodeError AnyPlutusScript
-> ExceptT PlutusScriptDecodeError m AnyPlutusScript
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either PlutusScriptDecodeError AnyPlutusScript
-> ExceptT PlutusScriptDecodeError m AnyPlutusScript)
-> Either PlutusScriptDecodeError AnyPlutusScript
-> ExceptT PlutusScriptDecodeError m AnyPlutusScript
forall a b. (a -> b) -> a -> b
$
ByteString -> Either PlutusScriptDecodeError AnyPlutusScript
deserialisePlutusScript ByteString
bs
readFileSimpleScript
:: MonadIOTransError (FileError ScriptDecodeError) t m
=> FilePath
-> t m (Script SimpleScript')
readFileSimpleScript :: forall (t :: (* -> *) -> * -> *) (m :: * -> *).
MonadIOTransError (FileError ScriptDecodeError) t m =>
String -> t m (Script SimpleScript')
readFileSimpleScript String
file = do
ByteString
scriptBytes <- (IOException -> FileError ScriptDecodeError)
-> m ByteString -> t m ByteString
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
(MonadIOTransError e' t m, Exception e) =>
(e -> e') -> m a -> t m a
handleIOExceptionsLiftWith (String -> IOException -> FileError ScriptDecodeError
forall e. String -> IOException -> FileError e
FileIOError String
file) (m ByteString -> t m ByteString)
-> (IO ByteString -> m ByteString)
-> IO ByteString
-> t m ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ByteString -> m ByteString
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ByteString -> t m ByteString)
-> IO ByteString -> t m ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO ByteString
BS.readFile String
file
(ScriptDecodeError -> FileError ScriptDecodeError)
-> ExceptT ScriptDecodeError m (Script SimpleScript')
-> t m (Script SimpleScript')
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (String -> ScriptDecodeError -> FileError ScriptDecodeError
forall e. String -> e -> FileError e
FileError String
file) (ExceptT ScriptDecodeError m (Script SimpleScript')
-> t m (Script SimpleScript'))
-> ExceptT ScriptDecodeError m (Script SimpleScript')
-> t m (Script SimpleScript')
forall a b. (a -> b) -> a -> b
$
Either ScriptDecodeError (Script SimpleScript')
-> ExceptT ScriptDecodeError m (Script SimpleScript')
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either ScriptDecodeError (Script SimpleScript')
-> ExceptT ScriptDecodeError m (Script SimpleScript'))
-> Either ScriptDecodeError (Script SimpleScript')
-> ExceptT ScriptDecodeError m (Script SimpleScript')
forall a b. (a -> b) -> a -> b
$
ByteString -> Either ScriptDecodeError (Script SimpleScript')
deserialiseSimpleScript ByteString
scriptBytes
readScriptDataOrFile
:: MonadIO m
=> ScriptDataOrFile
-> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile :: forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile (ScriptDataValue HashableScriptData
d) = HashableScriptData -> ExceptT ScriptDataError m HashableScriptData
forall a. a -> ExceptT ScriptDataError m a
forall (m :: * -> *) a. Monad m => a -> m a
return HashableScriptData
d
readScriptDataOrFile (ScriptDataJsonFile String
fp) = do
ByteString
sDataBs <- (IOException -> ScriptDataError)
-> IO ByteString -> ExceptT ScriptDataError m ByteString
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ScriptDataError
ScriptDataErrorFile (FileError () -> ScriptDataError)
-> (IOException -> FileError ()) -> IOException -> ScriptDataError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fp) (IO ByteString -> ExceptT ScriptDataError m ByteString)
-> IO ByteString -> ExceptT ScriptDataError m ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO ByteString
LBS.readFile String
fp
Value
sDataValue <- Either ScriptDataError Value -> ExceptT ScriptDataError m Value
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either ScriptDataError Value -> ExceptT ScriptDataError m Value)
-> (Either String Value -> Either ScriptDataError Value)
-> Either String Value
-> ExceptT ScriptDataError m Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> ScriptDataError)
-> Either String Value -> Either ScriptDataError Value
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (String -> String -> ScriptDataError
ScriptDataErrorJsonParse String
fp) (Either String Value -> ExceptT ScriptDataError m Value)
-> Either String Value -> ExceptT ScriptDataError m Value
forall a b. (a -> b) -> a -> b
$ ByteString -> Either String Value
forall a. FromJSON a => ByteString -> Either String a
Aeson.eitherDecode ByteString
sDataBs
Either ScriptDataError HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither
(Either ScriptDataError HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData)
-> (Either ScriptDataJsonBytesError HashableScriptData
-> Either ScriptDataError HashableScriptData)
-> Either ScriptDataJsonBytesError HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ScriptDataJsonBytesError -> ScriptDataError)
-> Either ScriptDataJsonBytesError HashableScriptData
-> Either ScriptDataError HashableScriptData
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first ScriptDataJsonBytesError -> ScriptDataError
ScriptDataErrorJsonBytes
(Either ScriptDataJsonBytesError HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData)
-> Either ScriptDataJsonBytesError HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData
forall a b. (a -> b) -> a -> b
$ ScriptDataJsonSchema
-> Value -> Either ScriptDataJsonBytesError HashableScriptData
scriptDataJsonToHashable ScriptDataJsonSchema
ScriptDataJsonDetailedSchema Value
sDataValue
readScriptDataOrFile (ScriptDataCborFile String
fp) = do
ByteString
origBs <- (IOException -> ScriptDataError)
-> IO ByteString -> ExceptT ScriptDataError m ByteString
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ScriptDataError
ScriptDataErrorFile (FileError () -> ScriptDataError)
-> (IOException -> FileError ()) -> IOException -> ScriptDataError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fp) (String -> IO ByteString
BS.readFile String
fp)
HashableScriptData
hSd <-
(DecoderError -> ScriptDataError)
-> ExceptT DecoderError m HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT (String -> DecoderError -> ScriptDataError
ScriptDataErrorMetadataDecode String
fp) (ExceptT DecoderError m HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData)
-> ExceptT DecoderError m HashableScriptData
-> ExceptT ScriptDataError m HashableScriptData
forall a b. (a -> b) -> a -> b
$
Either DecoderError HashableScriptData
-> ExceptT DecoderError m HashableScriptData
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either DecoderError HashableScriptData
-> ExceptT DecoderError m HashableScriptData)
-> Either DecoderError HashableScriptData
-> ExceptT DecoderError m HashableScriptData
forall a b. (a -> b) -> a -> b
$
AsType HashableScriptData
-> ByteString -> Either DecoderError HashableScriptData
forall a.
SerialiseAsCBOR a =>
AsType a -> ByteString -> Either DecoderError a
deserialiseFromCBOR AsType HashableScriptData
AsHashableScriptData ByteString
origBs
(ScriptDataRangeError -> ScriptDataError)
-> ExceptT ScriptDataRangeError m ()
-> ExceptT ScriptDataError m ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT (String -> ScriptDataRangeError -> ScriptDataError
ScriptDataErrorValidation String
fp) (ExceptT ScriptDataRangeError m () -> ExceptT ScriptDataError m ())
-> ExceptT ScriptDataRangeError m ()
-> ExceptT ScriptDataError m ()
forall a b. (a -> b) -> a -> b
$
Either ScriptDataRangeError () -> ExceptT ScriptDataRangeError m ()
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either ScriptDataRangeError ()
-> ExceptT ScriptDataRangeError m ())
-> Either ScriptDataRangeError ()
-> ExceptT ScriptDataRangeError m ()
forall a b. (a -> b) -> a -> b
$
ScriptData -> Either ScriptDataRangeError ()
validateScriptData (ScriptData -> Either ScriptDataRangeError ())
-> ScriptData -> Either ScriptDataRangeError ()
forall a b. (a -> b) -> a -> b
$
HashableScriptData -> ScriptData
getScriptData HashableScriptData
hSd
HashableScriptData -> ExceptT ScriptDataError m HashableScriptData
forall a. a -> ExceptT ScriptDataError m a
forall (m :: * -> *) a. Monad m => a -> m a
return HashableScriptData
hSd
readScriptRedeemerOrFile
:: ScriptRedeemerOrFile
-> ExceptT ScriptDataError IO ScriptRedeemer
readScriptRedeemerOrFile :: ScriptDataOrFile -> ExceptT ScriptDataError IO HashableScriptData
readScriptRedeemerOrFile = ScriptDataOrFile -> ExceptT ScriptDataError IO HashableScriptData
forall (m :: * -> *).
MonadIO m =>
ScriptDataOrFile -> ExceptT ScriptDataError m HashableScriptData
readScriptDataOrFile