{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Marconi.Orphans where

import Cardano.Api (BlockHeader, BlockNo (BlockNo), ChainPoint (ChainPoint, ChainPointAtGenesis),
                    ChainTip (ChainTip, ChainTipAtGenesis), Hash, SlotNo (SlotNo), serialiseToRawBytesHexText)
import Prettyprinter (Pretty (pretty), (<+>))

instance Pretty ChainTip where
  pretty :: ChainTip -> Doc ann
pretty ChainTip
ChainTipAtGenesis   = Doc ann
"ChainTipAtGenesis"
  pretty (ChainTip SlotNo
sn Hash BlockHeader
ha BlockNo
bn) = Doc ann
"ChainTip(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> SlotNo -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty SlotNo
sn Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Hash BlockHeader -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Hash BlockHeader
ha Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> BlockNo -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty BlockNo
bn Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")"

instance Pretty ChainPoint where
  pretty :: ChainPoint -> Doc ann
pretty ChainPoint
ChainPointAtGenesis = Doc ann
"ChainPointAtGenesis"
  pretty (ChainPoint SlotNo
sn Hash BlockHeader
ha)  = Doc ann
"ChainPoint(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> SlotNo -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty SlotNo
sn Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Hash BlockHeader -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Hash BlockHeader
ha Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")"

instance Pretty (Hash BlockHeader) where
  pretty :: Hash BlockHeader -> Doc ann
pretty Hash BlockHeader
hash = Doc ann
"BlockHash" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Hash BlockHeader -> Text
forall a. SerialiseAsRawBytes a => a -> Text
serialiseToRawBytesHexText Hash BlockHeader
hash)

instance Pretty SlotNo where
  pretty :: SlotNo -> Doc ann
pretty (SlotNo Word64
n) = Doc ann
"Slot" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word64 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Word64
n

instance Pretty BlockNo where
  pretty :: BlockNo -> Doc ann
pretty (BlockNo Word64
bn) = Doc ann
"BlockNo" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word64 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Word64
bn