{-# LANGUAGE NoImplicitPrelude   #-}
{-# LANGUAGE NoFieldSelectors    #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings   #-}

-- | Module exporting the 'Curator' type, used to represent Stack's

-- project-specific @curator@ option, which supports the needs of the

-- [@curator@ tool](https://github.com/commercialhaskell/curator).

module Stack.Types.Curator
  ( Curator (..)
  ) where

import           Data.Aeson.Types ( FromJSON (..), ToJSON (..), (.=), object )
import           Data.Aeson.WarningParser
                   ( WithJSONWarnings (..), (..:?), (..!=), withObjectWarnings )
import qualified Data.Set as Set
import           Stack.Prelude

-- | Type representing configuration options which support the needs of the

-- [@curator@ tool](https://github.com/commercialhaskell/curator).

data Curator = Curator
  { Curator -> Set PackageName
skipTest :: !(Set PackageName)
    -- ^ Packages for which Stack should ignore test suites.

  , Curator -> Set PackageName
expectTestFailure :: !(Set PackageName)
    -- ^ Packages for which Stack should expect building test suites to fail.

  , Curator -> Set PackageName
skipBenchmark :: !(Set PackageName)
    -- ^ Packages for which Stack should ignore benchmarks.

  , Curator -> Set PackageName
expectBenchmarkFailure :: !(Set PackageName)
    -- ^ Packages for which Stack should expect building benchmarks to fail.

  , Curator -> Set PackageName
skipHaddock :: !(Set PackageName)
    -- ^ Packages for which Stack should ignore creating Haddock documentation.

  , Curator -> Set PackageName
expectHaddockFailure :: !(Set PackageName)
    -- ^ Packages for which Stack should expect creating Haddock documentation

    -- to fail.

  }
  deriving Int -> Curator -> ShowS
[Curator] -> ShowS
Curator -> String
(Int -> Curator -> ShowS)
-> (Curator -> String) -> ([Curator] -> ShowS) -> Show Curator
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Curator -> ShowS
showsPrec :: Int -> Curator -> ShowS
$cshow :: Curator -> String
show :: Curator -> String
$cshowList :: [Curator] -> ShowS
showList :: [Curator] -> ShowS
Show

instance ToJSON Curator where
  toJSON :: Curator -> Value
toJSON Curator
curator = [Pair] -> Value
object
    [ Key
"skip-test" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.= (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.skipTest
    , Key
"expect-test-failure" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.= (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.expectTestFailure
    , Key
"skip-bench" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.= (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.skipBenchmark
    , Key
"expect-benchmark-failure" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.=
        (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.expectTestFailure
    , Key
"skip-haddock" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.= (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.skipHaddock
    , Key
"expect-haddock-failure" Key -> Set (CabalString PackageName) -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.=
        (PackageName -> CabalString PackageName)
-> Set PackageName -> Set (CabalString PackageName)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map PackageName -> CabalString PackageName
forall a. a -> CabalString a
CabalString Curator
curator.expectHaddockFailure
    ]

instance FromJSON (WithJSONWarnings Curator) where
  parseJSON :: Value -> Parser (WithJSONWarnings Curator)
parseJSON = String
-> (Object -> WarningParser Curator)
-> Value
-> Parser (WithJSONWarnings Curator)
forall a.
String
-> (Object -> WarningParser a)
-> Value
-> Parser (WithJSONWarnings a)
withObjectWarnings String
"Curator" ((Object -> WarningParser Curator)
 -> Value -> Parser (WithJSONWarnings Curator))
-> (Object -> WarningParser Curator)
-> Value
-> Parser (WithJSONWarnings Curator)
forall a b. (a -> b) -> a -> b
$ \Object
o -> Set PackageName
-> Set PackageName
-> Set PackageName
-> Set PackageName
-> Set PackageName
-> Set PackageName
-> Curator
Curator
    (Set PackageName
 -> Set PackageName
 -> Set PackageName
 -> Set PackageName
 -> Set PackageName
 -> Set PackageName
 -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WriterT
     WarningParserMonoid
     Parser
     (Set PackageName
      -> Set PackageName
      -> Set PackageName
      -> Set PackageName
      -> Set PackageName
      -> Curator)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString) (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"skip-test" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)
    WriterT
  WarningParserMonoid
  Parser
  (Set PackageName
   -> Set PackageName
   -> Set PackageName
   -> Set PackageName
   -> Set PackageName
   -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WriterT
     WarningParserMonoid
     Parser
     (Set PackageName
      -> Set PackageName
      -> Set PackageName
      -> Set PackageName
      -> Curator)
forall a b.
WriterT WarningParserMonoid Parser (a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString) (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"expect-test-failure" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)
    WriterT
  WarningParserMonoid
  Parser
  (Set PackageName
   -> Set PackageName
   -> Set PackageName
   -> Set PackageName
   -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WriterT
     WarningParserMonoid
     Parser
     (Set PackageName -> Set PackageName -> Set PackageName -> Curator)
forall a b.
WriterT WarningParserMonoid Parser (a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString) (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"skip-bench" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)
    WriterT
  WarningParserMonoid
  Parser
  (Set PackageName -> Set PackageName -> Set PackageName -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WriterT
     WarningParserMonoid
     Parser
     (Set PackageName -> Set PackageName -> Curator)
forall a b.
WriterT WarningParserMonoid Parser (a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
          ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString)
          (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"expect-benchmark-failure" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)
    WriterT
  WarningParserMonoid
  Parser
  (Set PackageName -> Set PackageName -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WriterT WarningParserMonoid Parser (Set PackageName -> Curator)
forall a b.
WriterT WarningParserMonoid Parser (a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString) (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"skip-haddock" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)
    WriterT WarningParserMonoid Parser (Set PackageName -> Curator)
-> WriterT WarningParserMonoid Parser (Set PackageName)
-> WarningParser Curator
forall a b.
WriterT WarningParserMonoid Parser (a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Set (CabalString PackageName) -> Set PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
-> WriterT WarningParserMonoid Parser (Set PackageName)
forall a b.
(a -> b)
-> WriterT WarningParserMonoid Parser a
-> WriterT WarningParserMonoid Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
          ((CabalString PackageName -> PackageName)
-> Set (CabalString PackageName) -> Set PackageName
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map CabalString PackageName -> PackageName
forall a. CabalString a -> a
unCabalString)
          (Object
o Object
-> Text -> WarningParser (Maybe (Set (CabalString PackageName)))
forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"expect-haddock-failure" WarningParser (Maybe (Set (CabalString PackageName)))
-> Set (CabalString PackageName)
-> WriterT
     WarningParserMonoid Parser (Set (CabalString PackageName))
forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= Set (CabalString PackageName)
forall a. Monoid a => a
mempty)