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

module Cardano.Ledger.Api.Leios (
  validateLeiosCert,
  LeiosCertEnv (..),
  DijkstraLeiosCertPredFailure (..),
  LeiosCert,
) where

import Cardano.Crypto.Leios (LeiosCert)
import Cardano.Ledger.BaseTypes (Globals)
import Cardano.Ledger.Core (Era)
import Cardano.Ledger.Dijkstra.Rules (
  DijkstraLeiosCertPredFailure (..),
  LEIOSCERT,
  LeiosCertEnv (..),
 )
import Control.Monad.Trans.Reader (runReader)
import Control.State.Transition.Extended (TRC (..), applySTS)
import Data.List.NonEmpty (NonEmpty)

validateLeiosCert ::
  forall era.
  Era era =>
  Globals ->
  LeiosCertEnv ->
  LeiosCert ->
  Either (NonEmpty (DijkstraLeiosCertPredFailure era)) ()
validateLeiosCert :: forall era.
Era era =>
Globals
-> LeiosCertEnv
-> LeiosCert
-> Either (NonEmpty (DijkstraLeiosCertPredFailure era)) ()
validateLeiosCert Globals
globals LeiosCertEnv
env LeiosCert
cert =
  Reader
  Globals (Either (NonEmpty (DijkstraLeiosCertPredFailure era)) ())
-> Globals
-> Either (NonEmpty (DijkstraLeiosCertPredFailure era)) ()
forall r a. Reader r a -> r -> a
runReader (forall s (m :: * -> *) (rtype :: RuleType).
(STS s, RuleTypeRep rtype, m ~ BaseM s) =>
RuleContext rtype s
-> m (Either (NonEmpty (PredicateFailure s)) (State s))
applySTS @(LEIOSCERT era) ((Environment (LEIOSCERT era), State (LEIOSCERT era),
 Signal (LEIOSCERT era))
-> TRC (LEIOSCERT era)
forall sts. (Environment sts, State sts, Signal sts) -> TRC sts
TRC (LeiosCertEnv
Environment (LEIOSCERT era)
env, (), LeiosCert
Signal (LEIOSCERT era)
cert))) Globals
globals