|
8 | 8 | {-# LANGUAGE TypeFamilies #-} |
9 | 9 |
|
10 | 10 | module Cardano.CLI.Compatible.Read |
11 | | - ( readFilePlutusScript |
| 11 | + ( AnyPlutusScript (..) |
| 12 | + , readFilePlutusScript |
12 | 13 | , readFileSimpleScript |
13 | 14 | ) |
14 | 15 | where |
15 | 16 |
|
16 | 17 | import Cardano.Api as Api |
17 | | -import Cardano.Api.Experimental.Plutus qualified as Exp |
18 | 18 |
|
19 | 19 | import Cardano.CLI.Compatible.Exception |
20 | 20 | import Cardano.CLI.Read (readFileCli) |
| 21 | +import Cardano.CLI.Type.Error.PlutusScriptDecodeError |
21 | 22 | import Cardano.CLI.Type.Error.ScriptDecodeError |
22 | 23 |
|
23 | 24 | import Prelude |
24 | 25 |
|
25 | 26 | import Data.Aeson qualified as Aeson |
| 27 | +import Data.Bifunctor |
26 | 28 | import Data.ByteString qualified as BS |
27 | 29 | import Data.Text qualified as Text |
28 | 30 |
|
@@ -53,21 +55,48 @@ deserialiseSimpleScript bs = |
53 | 55 | teType' :: FromSomeType HasTextEnvelope (Script SimpleScript') |
54 | 56 | teType' = FromSomeType (AsScript AsSimpleScript) id |
55 | 57 |
|
| 58 | +data AnyPlutusScript where |
| 59 | + AnyPlutusScript |
| 60 | + :: IsPlutusScriptLanguage lang => PlutusScriptVersion lang -> PlutusScript lang -> AnyPlutusScript |
| 61 | + |
56 | 62 | readFilePlutusScript |
57 | | - :: forall era e |
58 | | - . ShelleyBasedEra era |
59 | | - -> FilePath |
60 | | - -> CIO e (Exp.AnyPlutusScript (ShelleyLedgerEra era)) |
61 | | -readFilePlutusScript sbe plutusScriptFp = do |
62 | | - bs <- readFileCli plutusScriptFp |
63 | | - te <- fromEitherCli $ deserialiseFromJSON bs |
64 | | - let scriptBs = teRawCBOR te |
65 | | - TextEnvelopeType anyScriptType = teType te |
66 | | - case Exp.textToPlutusLanguage (Text.pack anyScriptType) of |
67 | | - Just lang -> |
68 | | - fromEitherCli |
69 | | - ( shelleyBasedEraConstraints sbe (Exp.decodeAnyPlutusScript scriptBs lang) |
70 | | - :: Either DecoderError (Exp.AnyPlutusScript (ShelleyLedgerEra era)) |
71 | | - ) |
72 | | - Nothing -> |
73 | | - throwCliError $ "Unsupported script language: " <> anyScriptType |
| 63 | + :: FilePath |
| 64 | + -> CIO e AnyPlutusScript |
| 65 | +readFilePlutusScript plutusScriptFp = do |
| 66 | + bs <- |
| 67 | + readFileCli plutusScriptFp |
| 68 | + fromEitherCli $ deserialisePlutusScript bs |
| 69 | + |
| 70 | +deserialisePlutusScript |
| 71 | + :: BS.ByteString |
| 72 | + -> Either PlutusScriptDecodeError AnyPlutusScript |
| 73 | +deserialisePlutusScript bs = do |
| 74 | + te <- first PlutusScriptJsonDecodeError $ deserialiseFromJSON bs |
| 75 | + case teType te of |
| 76 | + TextEnvelopeType s -> case s of |
| 77 | + "PlutusScriptV1" -> deserialiseAnyPlutusScriptVersion PlutusScriptV1 te |
| 78 | + "PlutusScriptV2" -> deserialiseAnyPlutusScriptVersion PlutusScriptV2 te |
| 79 | + "PlutusScriptV3" -> deserialiseAnyPlutusScriptVersion PlutusScriptV3 te |
| 80 | + unknownScriptVersion -> |
| 81 | + Left . PlutusScriptDecodeErrorUnknownVersion $ Text.pack unknownScriptVersion |
| 82 | + where |
| 83 | + deserialiseAnyPlutusScriptVersion |
| 84 | + :: IsPlutusScriptLanguage lang |
| 85 | + => PlutusScriptVersion lang |
| 86 | + -> TextEnvelope |
| 87 | + -> Either PlutusScriptDecodeError AnyPlutusScript |
| 88 | + deserialiseAnyPlutusScriptVersion lang tEnv = |
| 89 | + first PlutusScriptDecodeTextEnvelopeError $ |
| 90 | + deserialiseFromTextEnvelopeAnyOf [teTypes (AnyPlutusScriptVersion lang)] tEnv |
| 91 | + |
| 92 | + teTypes :: AnyPlutusScriptVersion -> FromSomeType HasTextEnvelope AnyPlutusScript |
| 93 | + teTypes = |
| 94 | + \case |
| 95 | + AnyPlutusScriptVersion PlutusScriptV1 -> |
| 96 | + FromSomeType (AsPlutusScript AsPlutusScriptV1) (AnyPlutusScript PlutusScriptV1) |
| 97 | + AnyPlutusScriptVersion PlutusScriptV2 -> |
| 98 | + FromSomeType (AsPlutusScript AsPlutusScriptV2) (AnyPlutusScript PlutusScriptV2) |
| 99 | + AnyPlutusScriptVersion PlutusScriptV3 -> |
| 100 | + FromSomeType (AsPlutusScript AsPlutusScriptV3) (AnyPlutusScript PlutusScriptV3) |
| 101 | + AnyPlutusScriptVersion PlutusScriptV4 -> |
| 102 | + FromSomeType (AsPlutusScript AsPlutusScriptV4) (AnyPlutusScript PlutusScriptV4) |
0 commit comments