{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.Api.DebugTools where

import Cardano.Ledger.Binary (DecCBOR, EncCBOR, Version, decodeFull')
import Cardano.Ledger.Binary.Encoding (serialize')
import Cardano.Ledger.Core (Era, eraProtVerLow)
import Control.Exception (throwIO)
import Control.Monad.IO.Class (MonadIO (..))
import qualified Data.ByteString as BS

readCBOR :: (DecCBOR a, MonadIO m) => Version -> FilePath -> m a
readCBOR :: forall a (m :: * -> *).
(DecCBOR a, MonadIO m) =>
Version -> FilePath -> m a
readCBOR Version
version FilePath
path = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
  ByteString
dat <- FilePath -> IO ByteString
BS.readFile FilePath
path
  case forall a.
DecCBOR a =>
Version -> ByteString -> Either DecoderError a
decodeFull' Version
version ByteString
dat of
    Right a
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
    Left DecoderError
err -> forall e a. Exception e => e -> IO a
throwIO DecoderError
err

writeCBOR :: (EncCBOR a, MonadIO m) => Version -> FilePath -> a -> m ()
writeCBOR :: forall a (m :: * -> *).
(EncCBOR a, MonadIO m) =>
Version -> FilePath -> a -> m ()
writeCBOR Version
version FilePath
path = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> ByteString -> IO ()
BS.writeFile FilePath
path forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. EncCBOR a => Version -> a -> ByteString
serialize' Version
version

readEraCBOR :: forall t era m. (Era era, DecCBOR (t era), MonadIO m) => FilePath -> m (t era)
readEraCBOR :: forall (t :: * -> *) era (m :: * -> *).
(Era era, DecCBOR (t era), MonadIO m) =>
FilePath -> m (t era)
readEraCBOR = forall a (m :: * -> *).
(DecCBOR a, MonadIO m) =>
Version -> FilePath -> m a
readCBOR (forall era. Era era => Version
eraProtVerLow @era)

writeEraCBOR :: forall t era m. (Era era, EncCBOR (t era), MonadIO m) => FilePath -> t era -> m ()
writeEraCBOR :: forall (t :: * -> *) era (m :: * -> *).
(Era era, EncCBOR (t era), MonadIO m) =>
FilePath -> t era -> m ()
writeEraCBOR = forall a (m :: * -> *).
(EncCBOR a, MonadIO m) =>
Version -> FilePath -> a -> m ()
writeCBOR (forall era. Era era => Version
eraProtVerLow @era)