module Cardano.CLI.Shelley.Run.TextView
  ( ShelleyTextViewFileError(..)
  , renderShelleyTextViewFileError
  , runTextViewCmd
  ) where

import           Cardano.Prelude

import qualified Data.Text as Text

import           Cardano.CLI.Helpers (HelpersError, pPrintCBOR, renderHelpersError)
import           Cardano.CLI.Shelley.Parsers

import           Cardano.Api.TextView (TextView (..))
import           Cardano.Api.Typed (Error (..), FileError, TextEnvelopeError,
                     readTextEnvelopeFromFile)

import           Control.Monad.Trans.Except.Extra (firstExceptT, newExceptT)

import qualified Data.ByteString.Lazy.Char8 as LBS

data ShelleyTextViewFileError
  = TextViewReadFileError (FileError TextEnvelopeError)
  | TextViewCBORPrettyPrintError !HelpersError
  deriving Int -> ShelleyTextViewFileError -> ShowS
[ShelleyTextViewFileError] -> ShowS
ShelleyTextViewFileError -> String
(Int -> ShelleyTextViewFileError -> ShowS)
-> (ShelleyTextViewFileError -> String)
-> ([ShelleyTextViewFileError] -> ShowS)
-> Show ShelleyTextViewFileError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ShelleyTextViewFileError] -> ShowS
$cshowList :: [ShelleyTextViewFileError] -> ShowS
show :: ShelleyTextViewFileError -> String
$cshow :: ShelleyTextViewFileError -> String
showsPrec :: Int -> ShelleyTextViewFileError -> ShowS
$cshowsPrec :: Int -> ShelleyTextViewFileError -> ShowS
Show

renderShelleyTextViewFileError :: ShelleyTextViewFileError -> Text
renderShelleyTextViewFileError :: ShelleyTextViewFileError -> Text
renderShelleyTextViewFileError ShelleyTextViewFileError
err =
  case ShelleyTextViewFileError
err of
    TextViewReadFileError FileError TextEnvelopeError
fileErr -> String -> Text
Text.pack (FileError TextEnvelopeError -> String
forall e. Error e => e -> String
displayError FileError TextEnvelopeError
fileErr)
    TextViewCBORPrettyPrintError HelpersError
hlprsErr ->
      Text
"Error pretty printing CBOR: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> HelpersError -> Text
renderHelpersError HelpersError
hlprsErr


runTextViewCmd :: TextViewCmd -> ExceptT ShelleyTextViewFileError IO ()
runTextViewCmd :: TextViewCmd -> ExceptT ShelleyTextViewFileError IO ()
runTextViewCmd TextViewCmd
cmd =
  case TextViewCmd
cmd of
    TextViewInfo String
fpath Maybe OutputFile
mOutfile -> String
-> Maybe OutputFile -> ExceptT ShelleyTextViewFileError IO ()
runTextViewInfo String
fpath Maybe OutputFile
mOutfile

runTextViewInfo :: FilePath -> Maybe OutputFile -> ExceptT ShelleyTextViewFileError IO ()
runTextViewInfo :: String
-> Maybe OutputFile -> ExceptT ShelleyTextViewFileError IO ()
runTextViewInfo String
fpath Maybe OutputFile
mOutFile = do
  TextEnvelope
tv <- (FileError TextEnvelopeError -> ShelleyTextViewFileError)
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> ExceptT ShelleyTextViewFileError IO TextEnvelope
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyTextViewFileError
TextViewReadFileError (ExceptT (FileError TextEnvelopeError) IO TextEnvelope
 -> ExceptT ShelleyTextViewFileError IO TextEnvelope)
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
-> ExceptT ShelleyTextViewFileError IO TextEnvelope
forall a b. (a -> b) -> a -> b
$ IO (Either (FileError TextEnvelopeError) TextEnvelope)
-> ExceptT (FileError TextEnvelopeError) IO TextEnvelope
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (String -> IO (Either (FileError TextEnvelopeError) TextEnvelope)
readTextEnvelopeFromFile String
fpath)
  let lbCBOR :: ByteString
lbCBOR = ByteString -> ByteString
LBS.fromStrict (TextEnvelope -> ByteString
tvRawCBOR TextEnvelope
tv)
  case Maybe OutputFile
mOutFile of
    Just (OutputFile String
oFpath) -> IO () -> ExceptT ShelleyTextViewFileError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyTextViewFileError IO ())
-> IO () -> ExceptT ShelleyTextViewFileError IO ()
forall a b. (a -> b) -> a -> b
$ String -> ByteString -> IO ()
LBS.writeFile String
oFpath ByteString
lbCBOR
    Maybe OutputFile
Nothing -> (HelpersError -> ShelleyTextViewFileError)
-> ExceptT HelpersError IO ()
-> ExceptT ShelleyTextViewFileError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT HelpersError -> ShelleyTextViewFileError
TextViewCBORPrettyPrintError (ExceptT HelpersError IO ()
 -> ExceptT ShelleyTextViewFileError IO ())
-> ExceptT HelpersError IO ()
-> ExceptT ShelleyTextViewFileError IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> ExceptT HelpersError IO ()
pPrintCBOR ByteString
lbCBOR