{-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-orphans #-}

-- | TextEnvelope Serialisation
--
-- The envelope type, its JSON codec and the pure decoders now live in the
-- cardano-keys package; re-exported here for compatibility, together with the
-- era-coupled and file-based functions this API adds on top of them.
module Cardano.Api.Serialise.TextEnvelope.Internal
  ( HasTextEnvelope (..)
  , textEnvelopeType
  , textEnvelopeTypeInEra
  , TextEnvelope (..)
  , TextEnvelopeType (..)
  , TextEnvelopeDescr (..)
  , textEnvelopeRawCBOR
  , TextEnvelopeError (..)
  , serialiseToTextEnvelope
  , deserialiseFromTextEnvelope
  , readFileTextEnvelope
  , writeFileTextEnvelope
  , writeFileTextEnvelopeWithOwnerPermissions
  , readTextEnvelopeFromFile
  , readTextEnvelopeOfTypeFromFile
  , textEnvelopeToJSON
  , serialiseTextEnvelope
  , legacyComparison
  , textEnvelopeTypeToEra

    -- * Reading one of several key types
  , FromSomeType (..)
  , deserialiseFromTextEnvelopeAnyOf
  , decodeTextEnvelopeJSON
  , deserialiseFromTextEnvelopeJSON
  , deserialiseFromTextEnvelopeJSONAnyOf
  , readFileTextEnvelopeAnyOf

    -- * Data family instances
  , AsType (..)
  )
where

import Cardano.Api.Era
import Cardano.Api.Error
import Cardano.Api.HasTypeProxy
import Cardano.Api.IO

import Cardano.Keys.Serialise.TextEnvelope

import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Except (ExceptT (..), runExceptT)
import Control.Monad.Trans.Except.Extra (firstExceptT, hoistEither)
import Data.Aeson qualified as Aeson
import Data.Text (Text)

instance Error TextEnvelopeError where
  prettyError :: forall ann. TextEnvelopeError -> Doc ann
prettyError = TextEnvelopeError -> Doc ann
forall ann. TextEnvelopeError -> Doc ann
renderTextEnvelopeError

textEnvelopeTypeInEra
  :: ()
  => HasTextEnvelope (f era)
  => CardanoEra era
  -> AsType (f era)
  -> TextEnvelopeType
textEnvelopeTypeInEra :: forall (f :: * -> *) era.
HasTextEnvelope (f era) =>
CardanoEra era -> AsType (f era) -> TextEnvelopeType
textEnvelopeTypeInEra CardanoEra era
_ =
  AsType (f era) -> TextEnvelopeType
forall a. HasTextEnvelope a => AsType a -> TextEnvelopeType
textEnvelopeType

-- | Write a value to a file in the text envelope format.
--
-- Note that this does /not/ set conservative file permissions: the file is
-- created with the default permissions which should be restricted with `umask`. When writing sensitive data such as
-- signing keys, use 'writeFileTextEnvelopeWithOwnerPermissions' instead,
-- which tries to restrict access to the file owner where the platform
-- supports it (see its documentation for the exact guarantees).
writeFileTextEnvelope
  :: HasTextEnvelope a
  => File content Out
  -> Maybe TextEnvelopeDescr
  -> a
  -> IO (Either (FileError ()) ())
writeFileTextEnvelope :: forall a content.
HasTextEnvelope a =>
File content 'Out
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope File content 'Out
outputFile Maybe TextEnvelopeDescr
mbDescr a
a =
  File content 'Out -> ByteString -> IO (Either (FileError ()) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile File content 'Out
outputFile (Maybe TextEnvelopeDescr -> a -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON Maybe TextEnvelopeDescr
mbDescr a
a)

-- | Like 'writeFileTextEnvelope', but the file is created so that only its
-- owner has access to it, to the extent the platform allows it.
--
-- On POSIX and Windows, the contents are written to a freshly created
-- temporary file which is then renamed over the target path. The target file
-- therefore never exists in a partially written state: if writing fails
-- midway (e.g. on a crash or a full disk), its previous contents are left
-- untouched. A pre-existing file is replaced wholesale: its previous
-- permission bits are not preserved, and a symlink is replaced by a regular
-- file rather than written through.
--
-- * On POSIX systems, the file is created with @0600@ permissions (read
--   and write for the file owner only, further filtered by the process's
--   @umask@), and its ownership is set to the current (real) user. The
--   contents are synced to disk before the rename and the directory after
--   it, so a power failure can neither leave an empty file at the target
--   path nor undo a completed write.
--
-- * On Windows, the file is owned by the current user, but no explicit
--   ACL is set: the file inherits the access control list of the target
--   directory.
--
-- * On WASM, this is currently a no-op: no file is written at all.
--
-- Use this when writing sensitive data such as signing keys.
writeFileTextEnvelopeWithOwnerPermissions
  :: HasTextEnvelope a
  => MonadIO m
  => File content Out
  -> Maybe TextEnvelopeDescr
  -> a
  -> m (Either (FileError ()) ())
writeFileTextEnvelopeWithOwnerPermissions :: forall a (m :: * -> *) content.
(HasTextEnvelope a, MonadIO m) =>
File content 'Out
-> Maybe TextEnvelopeDescr -> a -> m (Either (FileError ()) ())
writeFileTextEnvelopeWithOwnerPermissions File content 'Out
outputFile Maybe TextEnvelopeDescr
mbDescr a
a =
  File content 'Out -> ByteString -> m (Either (FileError ()) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFileWithOwnerPermissions File content 'Out
outputFile (Maybe TextEnvelopeDescr -> a -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON Maybe TextEnvelopeDescr
mbDescr a
a)

readFileTextEnvelope
  :: HasTextEnvelope a
  => File content In
  -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope :: forall a content.
HasTextEnvelope a =>
File content 'In -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope File content 'In
path =
  ExceptT (FileError TextEnvelopeError) IO a
-> IO (Either (FileError TextEnvelopeError) a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT (FileError TextEnvelopeError) IO a
 -> IO (Either (FileError TextEnvelopeError) a))
-> ExceptT (FileError TextEnvelopeError) IO a
-> IO (Either (FileError TextEnvelopeError) a)
forall a b. (a -> b) -> a -> b
$ do
    content <- FilePath
-> (FilePath -> IO ByteString)
-> ExceptT (FileError TextEnvelopeError) IO ByteString
forall (m :: * -> *) s e.
MonadIO m =>
FilePath -> (FilePath -> IO s) -> ExceptT (FileError e) m s
fileIOExceptT (File content 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File content 'In
path) FilePath -> IO ByteString
readFileBlocking
    firstExceptT (FileError (unFile path)) $
      hoistEither $
        deserialiseFromTextEnvelopeJSON content

readFileTextEnvelopeAnyOf
  :: [FromSomeType HasTextEnvelope b]
  -> File content In
  -> IO (Either (FileError TextEnvelopeError) b)
readFileTextEnvelopeAnyOf :: forall b content.
[FromSomeType HasTextEnvelope b]
-> File content 'In -> IO (Either (FileError TextEnvelopeError) b)
readFileTextEnvelopeAnyOf [FromSomeType HasTextEnvelope b]
types File content 'In
path =
  ExceptT (FileError TextEnvelopeError) IO b
-> IO (Either (FileError TextEnvelopeError) b)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT (FileError TextEnvelopeError) IO b
 -> IO (Either (FileError TextEnvelopeError) b))
-> ExceptT (FileError TextEnvelopeError) IO b
-> IO (Either (FileError TextEnvelopeError) b)
forall a b. (a -> b) -> a -> b
$ do
    content <- FilePath
-> (FilePath -> IO ByteString)
-> ExceptT (FileError TextEnvelopeError) IO ByteString
forall (m :: * -> *) s e.
MonadIO m =>
FilePath -> (FilePath -> IO s) -> ExceptT (FileError e) m s
fileIOExceptT (File content 'In -> FilePath
forall content (direction :: FileDirection).
File content direction -> FilePath
unFile File content 'In
path) FilePath -> IO ByteString
readFileBlocking
    firstExceptT (FileError (unFile path)) $
      hoistEither $
        deserialiseFromTextEnvelopeJSONAnyOf types content

readTextEnvelopeFromFile
  :: FilePath
  -> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeFromFile :: FilePath -> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeFromFile FilePath
path =
  ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> IO (Either (FileError TextEnvelopeError) TextEnvelope)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT (FileError TextEnvelopeError) IO TextEnvelope
 -> IO (Either (FileError TextEnvelopeError) TextEnvelope))
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> IO (Either (FileError TextEnvelopeError) TextEnvelope)
forall a b. (a -> b) -> a -> b
$ do
    bs <- FilePath
-> (FilePath -> IO ByteString)
-> ExceptT (FileError TextEnvelopeError) IO ByteString
forall (m :: * -> *) s e.
MonadIO m =>
FilePath -> (FilePath -> IO s) -> ExceptT (FileError e) m s
fileIOExceptT FilePath
path FilePath -> IO ByteString
readFileBlocking
    firstExceptT (FileError path . TextEnvelopeAesonDecodeError)
      . hoistEither
      $ Aeson.eitherDecodeStrict' bs

readTextEnvelopeOfTypeFromFile
  :: TextEnvelopeType
  -> FilePath
  -> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeOfTypeFromFile :: TextEnvelopeType
-> FilePath
-> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeOfTypeFromFile TextEnvelopeType
expectedType FilePath
path =
  ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> IO (Either (FileError TextEnvelopeError) TextEnvelope)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT (FileError TextEnvelopeError) IO TextEnvelope
 -> IO (Either (FileError TextEnvelopeError) TextEnvelope))
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> IO (Either (FileError TextEnvelopeError) TextEnvelope)
forall a b. (a -> b) -> a -> b
$ do
    te <- IO (Either (FileError TextEnvelopeError) TextEnvelope)
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT (FilePath -> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeFromFile FilePath
path)
    firstExceptT (FileError path) $
      hoistEither $
        expectTextEnvelopeOfType (pure expectedType) te
    return te

textEnvelopeTypeToEra :: Text -> Either TextEnvelopeError AnyShelleyBasedEra
textEnvelopeTypeToEra :: Text -> Either TextEnvelopeError AnyShelleyBasedEra
textEnvelopeTypeToEra =
  \case
    Text
"TxSignedShelley" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ShelleyEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley
    Text
"Tx AllegraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AllegraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra
    Text
"Tx MaryEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra MaryEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra MaryEra
ShelleyBasedEraMary
    Text
"Tx AlonzoEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AlonzoEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo
    Text
"Tx BabbageEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra BabbageEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage
    Text
"Tx ConwayEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ConwayEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ConwayEra
ShelleyBasedEraConway
    Text
"Tx DijkstraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra DijkstraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra DijkstraEra
ShelleyBasedEraDijkstra
    Text
"Witnessed Tx ShelleyEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ShelleyEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley
    Text
"Witnessed Tx AllegraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AllegraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra
    Text
"Witnessed Tx MaryEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra MaryEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra MaryEra
ShelleyBasedEraMary
    Text
"Witnessed Tx AlonzoEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AlonzoEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo
    Text
"Witnessed Tx BabbageEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra BabbageEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage
    Text
"Witnessed Tx ConwayEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ConwayEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ConwayEra
ShelleyBasedEraConway
    Text
"Witnessed Tx DijkstraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra DijkstraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra DijkstraEra
ShelleyBasedEraDijkstra
    Text
"Unwitnessed Tx ShelleyEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ShelleyEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley
    Text
"Unwitnessed Tx AllegraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AllegraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra
    Text
"Unwitnessed Tx MaryEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra MaryEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra MaryEra
ShelleyBasedEraMary
    Text
"Unwitnessed Tx AlonzoEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AlonzoEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo
    Text
"Unwitnessed Tx BabbageEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra BabbageEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage
    Text
"Unwitnessed Tx ConwayEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ConwayEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ConwayEra
ShelleyBasedEraConway
    Text
"Unwitnessed Tx DijkstraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra DijkstraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra DijkstraEra
ShelleyBasedEraDijkstra
    Text
"TxWitness ShelleyEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ShelleyEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley
    Text
"TxWitness AllegraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AllegraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra
    Text
"TxWitness MaryEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra MaryEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra MaryEra
ShelleyBasedEraMary
    Text
"TxWitness AlonzoEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra AlonzoEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo
    Text
"TxWitness BabbageEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra BabbageEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage
    Text
"TxWitness ConwayEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra ConwayEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra ConwayEra
ShelleyBasedEraConway
    Text
"TxWitness DijkstraEra" -> AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra
forall a. a -> Either TextEnvelopeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyShelleyBasedEra -> Either TextEnvelopeError AnyShelleyBasedEra)
-> AnyShelleyBasedEra
-> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra DijkstraEra -> AnyShelleyBasedEra
forall era.
Typeable era =>
ShelleyBasedEra era -> AnyShelleyBasedEra
AnyShelleyBasedEra ShelleyBasedEra DijkstraEra
ShelleyBasedEraDijkstra
    Text
unknownCddlType -> TextEnvelopeError -> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. a -> Either a b
Left (TextEnvelopeError -> Either TextEnvelopeError AnyShelleyBasedEra)
-> TextEnvelopeError -> Either TextEnvelopeError AnyShelleyBasedEra
forall a b. (a -> b) -> a -> b
$ Text -> TextEnvelopeError
TextEnvelopeUnknownType Text
unknownCddlType