content: {-# OPTIONS_GHC -fno-warn-deprecations #-}
  {-# LANGUAGE LambdaCase #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE NamedFieldPuns #-}
  module Test.Hspec.Api.Format.V1.Internal (
    FailureReason(..)
  , module Test.Hspec.Api.Format.V1.Internal
  ) where
  
  import           Test.Hspec.Core.Util (stripAnsi)
  import           Test.Hspec.Core.Formatters.V1 (FailureReason(..))
  import qualified Test.Hspec.Api.Format.V2 as V2
  import           Test.Hspec.Api.Format.V2 hiding (Item(..), Result(..), FailureReason(..))
  
  data Item = Item {
    itemLocation :: Maybe Location
  , itemDuration :: Seconds
  , itemInfo :: String
  , itemResult :: Result
  } deriving Show
  
  data Result =
      Success
    | Pending (Maybe Location) (Maybe String)
    | Failure (Maybe Location) FailureReason
    deriving Show
  
  liftItem :: Item -> V2.Item
  liftItem Item{..} = V2.Item {
    itemLocation
  , itemDuration
  , itemInfo
  , itemResult = liftResult itemResult
  }
  
  unliftItem :: V2.Item -> Item
  unliftItem V2.Item{..} = Item {
    itemLocation
  , itemDuration
  , itemInfo
  , itemResult = unliftResult itemResult
  }
  
  liftResult :: Result -> V2.Result
  liftResult = \ case
    Success -> V2.Success
    Pending loc reason -> V2.Pending loc reason
    Failure loc reason -> V2.Failure loc (liftFailureReson reason)
  
  unliftResult :: V2.Result -> Result
  unliftResult = \ case
    V2.Success -> Success
    V2.Pending loc reason -> Pending loc reason
    V2.Failure loc reason -> Failure loc (unliftFailureReason reason)
  
  liftFailureReson :: FailureReason -> V2.FailureReason
  liftFailureReson = \ case
    NoReason -> V2.NoReason
    Reason reason -> V2.Reason reason
    ExpectedButGot preface expected actual -> V2.ExpectedButGot preface expected actual
    Error info e -> V2.Error info e
  
  unliftFailureReason :: V2.FailureReason -> FailureReason
  unliftFailureReason = \ case
    V2.NoReason -> NoReason
    V2.Reason reason -> Reason reason
    V2.ColorizedReason reason -> Reason (stripAnsi reason)
    V2.ExpectedButGot preface expected actual -> ExpectedButGot preface expected actual
    V2.Error info e -> Error info e
  