-- SPDX-FileCopyrightText: 2022 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

{-# OPTIONS_HADDOCK not-home #-}

-- | This module defines 'ScenarioBranchName' and required instances to use it
-- with 'ExceptionAnnotation'.
module Test.Cleveland.Internal.Exceptions.ScenarioBranchName
  ( module Test.Cleveland.Internal.Exceptions.ScenarioBranchName
  ) where

import Fmt (Buildable(..), nameF, (+|), (|+))

import Test.Cleveland.Internal.Exceptions.Annotated

-- | When using 'Test.Cleveland.branchout' function for building test scenarios - names
-- of branches we are currently within.
newtype ScenarioBranchName = ScenarioBranchName { ScenarioBranchName -> [Text]
unTestBranch :: [Text] }
  deriving stock (Int -> ScenarioBranchName -> ShowS
[ScenarioBranchName] -> ShowS
ScenarioBranchName -> String
(Int -> ScenarioBranchName -> ShowS)
-> (ScenarioBranchName -> String)
-> ([ScenarioBranchName] -> ShowS)
-> Show ScenarioBranchName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ScenarioBranchName -> ShowS
showsPrec :: Int -> ScenarioBranchName -> ShowS
$cshow :: ScenarioBranchName -> String
show :: ScenarioBranchName -> String
$cshowList :: [ScenarioBranchName] -> ShowS
showList :: [ScenarioBranchName] -> ShowS
Show, ScenarioBranchName -> ScenarioBranchName -> Bool
(ScenarioBranchName -> ScenarioBranchName -> Bool)
-> (ScenarioBranchName -> ScenarioBranchName -> Bool)
-> Eq ScenarioBranchName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ScenarioBranchName -> ScenarioBranchName -> Bool
== :: ScenarioBranchName -> ScenarioBranchName -> Bool
$c/= :: ScenarioBranchName -> ScenarioBranchName -> Bool
/= :: ScenarioBranchName -> ScenarioBranchName -> Bool
Eq)
  deriving newtype NonEmpty ScenarioBranchName -> ScenarioBranchName
ScenarioBranchName -> ScenarioBranchName -> ScenarioBranchName
(ScenarioBranchName -> ScenarioBranchName -> ScenarioBranchName)
-> (NonEmpty ScenarioBranchName -> ScenarioBranchName)
-> (forall b.
    Integral b =>
    b -> ScenarioBranchName -> ScenarioBranchName)
-> Semigroup ScenarioBranchName
forall b.
Integral b =>
b -> ScenarioBranchName -> ScenarioBranchName
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: ScenarioBranchName -> ScenarioBranchName -> ScenarioBranchName
<> :: ScenarioBranchName -> ScenarioBranchName -> ScenarioBranchName
$csconcat :: NonEmpty ScenarioBranchName -> ScenarioBranchName
sconcat :: NonEmpty ScenarioBranchName -> ScenarioBranchName
$cstimes :: forall b.
Integral b =>
b -> ScenarioBranchName -> ScenarioBranchName
stimes :: forall b.
Integral b =>
b -> ScenarioBranchName -> ScenarioBranchName
Semigroup

instance ExceptionAnnotation ScenarioBranchName where
  displayAnnotation :: ScenarioBranchName -> Doc -> Doc
displayAnnotation ScenarioBranchName
ann = Doc -> Doc -> Doc
forall a. Buildable a => Doc -> a -> Doc
nameF (Doc
"In branch '" Doc -> Doc -> Doc
forall b. FromDoc b => Doc -> Doc -> b
+| ScenarioBranchName
ann ScenarioBranchName -> Doc -> Doc
forall a b. (Buildable a, FromDoc b) => a -> Doc -> b
|+ Doc
"'")

instance Buildable ScenarioBranchName where
  build :: ScenarioBranchName -> Doc
build = [Doc] -> Doc
forall a. Monoid a => [a] -> a
mconcat ([Doc] -> Doc)
-> (ScenarioBranchName -> [Doc]) -> ScenarioBranchName -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> [Doc] -> [Doc]
forall a. a -> [a] -> [a]
intersperse Doc
"/" ([Doc] -> [Doc])
-> (ScenarioBranchName -> [Doc]) -> ScenarioBranchName -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Doc) -> [Text] -> [Doc]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map Text -> Doc
forall a. Buildable a => a -> Doc
build ([Text] -> [Doc])
-> (ScenarioBranchName -> [Text]) -> ScenarioBranchName -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ScenarioBranchName -> [Text]
unTestBranch