{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Cardano.CLI.EraIndependent.Debug.CheckNodeConfiguration.Run (runCheckNodeConfig) where

import Cardano.Api

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.EraIndependent.Debug.CheckNodeConfiguration.Command
import Cardano.CLI.Type.Error.DebugCmdError

import System.IO qualified as IO

-- | Check a node configuration file by reading it the way 'readNodeConfig'
-- does: every genesis file it names must exist, decode, and match the hash the
-- configuration gives for it.
runCheckNodeConfig :: CheckNodeConfigCmdArgs -> CIO e ()
runCheckNodeConfig :: forall e. CheckNodeConfigCmdArgs -> CIO e ()
runCheckNodeConfig (CheckNodeConfigCmdArgs NodeConfigFile 'In
configFile) = do
  _ <-
    ExceptT DebugCmdError IO (NodeConfig, [ConfigWarning])
-> RIO e (NodeConfig, [ConfigWarning])
forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
ExceptT e IO a -> m a
fromExceptTCli (ExceptT DebugCmdError IO (NodeConfig, [ConfigWarning])
 -> RIO e (NodeConfig, [ConfigWarning]))
-> (ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
    -> ExceptT DebugCmdError IO (NodeConfig, [ConfigWarning]))
-> ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
-> RIO e (NodeConfig, [ConfigWarning])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NodeConfigError -> DebugCmdError)
-> ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
-> ExceptT DebugCmdError IO (NodeConfig, [ConfigWarning])
forall e' (t :: (* -> *) -> * -> *) (m :: * -> *) e a.
MonadTransError e' t m =>
(e -> e') -> ExceptT e m a -> t m a
modifyError (String -> NodeConfigError -> DebugCmdError
DebugNodeConfigReadCmdError String
configFilePath) (ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
 -> RIO e (NodeConfig, [ConfigWarning]))
-> ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
-> RIO e (NodeConfig, [ConfigWarning])
forall a b. (a -> b) -> a -> b
$
      NodeConfigFile 'In
-> ExceptT NodeConfigError IO (NodeConfig, [ConfigWarning])
forall (m :: * -> *).
(MonadError NodeConfigError m, MonadIO m) =>
NodeConfigFile 'In -> m (NodeConfig, [ConfigWarning])
readNodeConfig NodeConfigFile 'In
configFile
  liftIO $
    IO.hPutStrLn IO.stderr $
      "Successfully checked node configuration file: " <> configFilePath
 where
  configFilePath :: String
configFilePath = NodeConfigFile 'In -> String
forall content (direction :: FileDirection).
File content direction -> String
unFile NodeConfigFile 'In
configFile