{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.CLI.Orphan
  (
  )
where

import Cardano.Api
import Cardano.Api.Ledger qualified as L
import Cardano.Api.Shelley (VotesMergingConflict, scriptDataToJsonDetailedSchema)

import Data.Aeson

instance Error (VotesMergingConflict era) where
  prettyError :: forall ann. VotesMergingConflict era -> Doc ann
prettyError = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann)
-> (VotesMergingConflict era -> String)
-> VotesMergingConflict era
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VotesMergingConflict era -> String
forall a. Show a => a -> String
show

-- TODO upstream this orphaned instance to the ledger
instance (L.EraTxOut ledgerera, L.EraGov ledgerera) => ToJSON (L.NewEpochState ledgerera) where
  toJSON :: NewEpochState ledgerera -> Value
toJSON (L.NewEpochState EpochNo
nesEL BlocksMade (EraCrypto ledgerera)
nesBprev BlocksMade (EraCrypto ledgerera)
nesBCur EpochState ledgerera
nesEs StrictMaybe (PulsingRewUpdate (EraCrypto ledgerera))
nesRu PoolDistr (EraCrypto ledgerera)
nesPd StashedAVVMAddresses ledgerera
_stashedAvvm) =
    [Pair] -> Value
object
      [ Key
"currentEpoch" Key -> EpochNo -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= EpochNo
nesEL
      , Key
"priorBlocks" Key -> BlocksMade (EraCrypto ledgerera) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BlocksMade (EraCrypto ledgerera)
nesBprev
      , Key
"currentEpochBlocks" Key -> BlocksMade (EraCrypto ledgerera) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= BlocksMade (EraCrypto ledgerera)
nesBCur
      , Key
"currentEpochState" Key -> EpochState ledgerera -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= EpochState ledgerera
nesEs
      , Key
"rewardUpdate" Key -> StrictMaybe (PulsingRewUpdate (EraCrypto ledgerera)) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= StrictMaybe (PulsingRewUpdate (EraCrypto ledgerera))
nesRu
      , Key
"currentStakeDistribution" Key -> PoolDistr (EraCrypto ledgerera) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PoolDistr (EraCrypto ledgerera)
nesPd
      ]

instance ToJSON HashableScriptData where
  toJSON :: HashableScriptData -> Value
toJSON HashableScriptData
hsd =
    [Pair] -> Value
object
      [ Key
"hash" Key -> Hash ScriptData -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= HashableScriptData -> Hash ScriptData
hashScriptDataBytes HashableScriptData
hsd
      , Key
"json" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= HashableScriptData -> Value
scriptDataToJsonDetailedSchema HashableScriptData
hsd
      ]