{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE ViewPatterns      #-}


module Stack.Types.SetupInfo
  ( SetupInfo (..)
  ) where

import qualified Data.Map as Map
import           Pantry.Internal.AesonExtended
                   ( FromJSON (..), WithJSONWarnings, (..:?), (..!=)
                   , jsonSubWarningsT, jsonSubWarningsTT, withObjectWarnings
                   )
import           Stack.Prelude
import           Stack.Types.DownloadInfo ( DownloadInfo )
import           Stack.Types.VersionedDownloadInfo ( VersionedDownloadInfo )
import           Stack.Types.GHCDownloadInfo ( GHCDownloadInfo )

data SetupInfo = SetupInfo
  { SetupInfo -> Maybe DownloadInfo
siSevenzExe :: Maybe DownloadInfo
  , SetupInfo -> Maybe DownloadInfo
siSevenzDll :: Maybe DownloadInfo
  , SetupInfo -> Map Text VersionedDownloadInfo
siMsys2 :: Map Text VersionedDownloadInfo
  , SetupInfo -> Map Text (Map Version GHCDownloadInfo)
siGHCs :: Map Text (Map Version GHCDownloadInfo)
  , SetupInfo -> Map Text (Map Version DownloadInfo)
siStack :: Map Text (Map Version DownloadInfo)
  }
  deriving Int -> SetupInfo -> ShowS
[SetupInfo] -> ShowS
SetupInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetupInfo] -> ShowS
$cshowList :: [SetupInfo] -> ShowS
show :: SetupInfo -> String
$cshow :: SetupInfo -> String
showsPrec :: Int -> SetupInfo -> ShowS
$cshowsPrec :: Int -> SetupInfo -> ShowS
Show

instance FromJSON (WithJSONWarnings SetupInfo) where
  parseJSON :: Value -> Parser (WithJSONWarnings SetupInfo)
parseJSON = forall a.
String
-> (Object -> WarningParser a)
-> Value
-> Parser (WithJSONWarnings a)
withObjectWarnings String
"SetupInfo" forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Maybe DownloadInfo
siSevenzExe <- forall (t :: * -> *) a.
Traversable t =>
WarningParser (t (WithJSONWarnings a)) -> WarningParser (t a)
jsonSubWarningsT (Object
o forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"sevenzexe-info")
    Maybe DownloadInfo
siSevenzDll <- forall (t :: * -> *) a.
Traversable t =>
WarningParser (t (WithJSONWarnings a)) -> WarningParser (t a)
jsonSubWarningsT (Object
o forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"sevenzdll-info")
    Map Text VersionedDownloadInfo
siMsys2 <- forall (t :: * -> *) a.
Traversable t =>
WarningParser (t (WithJSONWarnings a)) -> WarningParser (t a)
jsonSubWarningsT (Object
o forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"msys2" forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= forall a. Monoid a => a
mempty)
    (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a v. Map (CabalString a) v -> Map a v
unCabalStringMap -> Map Text (Map Version GHCDownloadInfo)
siGHCs) <-
      forall (t :: * -> *) (u :: * -> *) a.
(Traversable t, Traversable u) =>
WarningParser (u (t (WithJSONWarnings a)))
-> WarningParser (u (t a))
jsonSubWarningsTT (Object
o forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"ghc" forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= forall a. Monoid a => a
mempty)
    (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a v. Map (CabalString a) v -> Map a v
unCabalStringMap -> Map Text (Map Version DownloadInfo)
siStack) <-
      forall (t :: * -> *) (u :: * -> *) a.
(Traversable t, Traversable u) =>
WarningParser (u (t (WithJSONWarnings a)))
-> WarningParser (u (t a))
jsonSubWarningsTT (Object
o forall a. FromJSON a => Object -> Text -> WarningParser (Maybe a)
..:? Text
"stack" forall a. WarningParser (Maybe a) -> a -> WarningParser a
..!= forall a. Monoid a => a
mempty)
    forall (f :: * -> *) a. Applicative f => a -> f a
pure SetupInfo {Maybe DownloadInfo
Map Text (Map Version DownloadInfo)
Map Text (Map Version GHCDownloadInfo)
Map Text VersionedDownloadInfo
siStack :: Map Text (Map Version DownloadInfo)
siGHCs :: Map Text (Map Version GHCDownloadInfo)
siMsys2 :: Map Text VersionedDownloadInfo
siSevenzDll :: Maybe DownloadInfo
siSevenzExe :: Maybe DownloadInfo
siStack :: Map Text (Map Version DownloadInfo)
siGHCs :: Map Text (Map Version GHCDownloadInfo)
siMsys2 :: Map Text VersionedDownloadInfo
siSevenzDll :: Maybe DownloadInfo
siSevenzExe :: Maybe DownloadInfo
..}

-- | For the @siGHCs@ field maps are deeply merged. For all fields the values

-- from the first @SetupInfo@ win.

instance Semigroup SetupInfo where
  SetupInfo
l <> :: SetupInfo -> SetupInfo -> SetupInfo
<> SetupInfo
r =
    SetupInfo
    { siSevenzExe :: Maybe DownloadInfo
siSevenzExe = SetupInfo -> Maybe DownloadInfo
siSevenzExe SetupInfo
l forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SetupInfo -> Maybe DownloadInfo
siSevenzExe SetupInfo
r
    , siSevenzDll :: Maybe DownloadInfo
siSevenzDll = SetupInfo -> Maybe DownloadInfo
siSevenzDll SetupInfo
l forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SetupInfo -> Maybe DownloadInfo
siSevenzDll SetupInfo
r
    , siMsys2 :: Map Text VersionedDownloadInfo
siMsys2 = SetupInfo -> Map Text VersionedDownloadInfo
siMsys2 SetupInfo
l forall a. Semigroup a => a -> a -> a
<> SetupInfo -> Map Text VersionedDownloadInfo
siMsys2 SetupInfo
r
    , siGHCs :: Map Text (Map Version GHCDownloadInfo)
siGHCs = forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Semigroup a => a -> a -> a
(<>) (SetupInfo -> Map Text (Map Version GHCDownloadInfo)
siGHCs SetupInfo
l) (SetupInfo -> Map Text (Map Version GHCDownloadInfo)
siGHCs SetupInfo
r)
    , siStack :: Map Text (Map Version DownloadInfo)
siStack = forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Semigroup a => a -> a -> a
(<>) (SetupInfo -> Map Text (Map Version DownloadInfo)
siStack SetupInfo
l) (SetupInfo -> Map Text (Map Version DownloadInfo)
siStack SetupInfo
r) }

instance Monoid SetupInfo where
  mempty :: SetupInfo
mempty =
    SetupInfo
    { siSevenzExe :: Maybe DownloadInfo
siSevenzExe = forall a. Maybe a
Nothing
    , siSevenzDll :: Maybe DownloadInfo
siSevenzDll = forall a. Maybe a
Nothing
    , siMsys2 :: Map Text VersionedDownloadInfo
siMsys2 = forall k a. Map k a
Map.empty
    , siGHCs :: Map Text (Map Version GHCDownloadInfo)
siGHCs = forall k a. Map k a
Map.empty
    , siStack :: Map Text (Map Version DownloadInfo)
siStack = forall k a. Map k a
Map.empty
    }
  mappend :: SetupInfo -> SetupInfo -> SetupInfo
mappend = forall a. Semigroup a => a -> a -> a
(<>)