{-# LANGUAGE DeriveAnyClass       #-}
{-# LANGUAGE DeriveGeneric        #-}
{-# LANGUAGE DerivingStrategies   #-}
{-# LANGUAGE DerivingVia          #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE MonoLocalBinds       #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}


module Ledger.Tx.Orphans where

import Data.Aeson (FromJSON (parseJSON), KeyValue ((.=)), ToJSON (toJSON), Value (Object), object, (.:))
import Data.Aeson.Types (parseFail, prependFailure, typeMismatch)

import Cardano.Api qualified as C

import Ledger.Address.Orphans ()
import Ledger.Builtins.Orphans ()
import Ledger.Credential.Orphans ()
import Ledger.Scripts.Orphans ()
import Ledger.Tx.Orphans.V1 ()
import Ledger.Tx.Orphans.V2 ()
import Ledger.Value.Orphans ()

instance ToJSON (C.Tx C.BabbageEra) where
  toJSON :: Tx BabbageEra -> Value
toJSON Tx BabbageEra
tx =
    [Pair] -> Value
object [ Key
"tx" Key -> TextEnvelope -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Maybe TextEnvelopeDescr -> Tx BabbageEra -> TextEnvelope
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> TextEnvelope
C.serialiseToTextEnvelope Maybe TextEnvelopeDescr
forall a. Maybe a
Nothing Tx BabbageEra
tx ]

instance FromJSON (C.Tx C.BabbageEra) where
  parseJSON :: Value -> Parser (Tx BabbageEra)
parseJSON (Object Object
v) = do
   TextEnvelope
envelope <- Object
v Object -> Key -> Parser TextEnvelope
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"tx"
   (TextEnvelopeError -> Parser (Tx BabbageEra))
-> (Tx BabbageEra -> Parser (Tx BabbageEra))
-> Either TextEnvelopeError (Tx BabbageEra)
-> Parser (Tx BabbageEra)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Parser (Tx BabbageEra)
-> TextEnvelopeError -> Parser (Tx BabbageEra)
forall a b. a -> b -> a
const (Parser (Tx BabbageEra)
 -> TextEnvelopeError -> Parser (Tx BabbageEra))
-> Parser (Tx BabbageEra)
-> TextEnvelopeError
-> Parser (Tx BabbageEra)
forall a b. (a -> b) -> a -> b
$ String -> Parser (Tx BabbageEra)
forall a. String -> Parser a
parseFail String
"Failed to parse BabbageEra 'tx' field from SomeCardanoApiTx")
          Tx BabbageEra -> Parser (Tx BabbageEra)
forall (f :: * -> *) a. Applicative f => a -> f a
pure
          (Either TextEnvelopeError (Tx BabbageEra)
 -> Parser (Tx BabbageEra))
-> Either TextEnvelopeError (Tx BabbageEra)
-> Parser (Tx BabbageEra)
forall a b. (a -> b) -> a -> b
$ AsType (Tx BabbageEra)
-> TextEnvelope -> Either TextEnvelopeError (Tx BabbageEra)
forall a.
HasTextEnvelope a =>
AsType a -> TextEnvelope -> Either TextEnvelopeError a
C.deserialiseFromTextEnvelope (AsType BabbageEra -> AsType (Tx BabbageEra)
forall era. AsType era -> AsType (Tx era)
C.AsTx AsType BabbageEra
C.AsBabbageEra) TextEnvelope
envelope
  parseJSON Value
invalid =
    String -> Parser (Tx BabbageEra) -> Parser (Tx BabbageEra)
forall a. String -> Parser a -> Parser a
prependFailure String
"parsing SomeCardanoApiTx failed, " (String -> Value -> Parser (Tx BabbageEra)
forall a. String -> Value -> Parser a
typeMismatch String
"Object" Value
invalid)