{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE FlexibleInstances #-}

{-|
Module      : GHCup.Types.Stack
Description : GHCup types.Stack
Copyright   : (c) Julian Ospald, 2023
License     : LGPL-3.0
Maintainer  : hasufell@hasufell.de
Stability   : experimental
Portability : portable
-}
module GHCup.Types.Stack where

import           GHCup.Types.JSON.Versions ()

import           Control.Applicative
import           Control.DeepSeq                ( NFData )
import           Data.ByteString
import           Data.Aeson
import           Data.Aeson.Types
import           Data.Map.Strict                ( Map )
import           Data.Text                      ( Text )
import           Data.Text.Encoding
import           Data.Versions

import qualified Data.Map as Map
import qualified GHC.Generics                  as GHC


    --------------------------------------
    --[ Stack download info copy pasta ]--
    --------------------------------------

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
(Int -> SetupInfo -> ShowS)
-> (SetupInfo -> String)
-> ([SetupInfo] -> ShowS)
-> Show SetupInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SetupInfo -> ShowS
showsPrec :: Int -> SetupInfo -> ShowS
$cshow :: SetupInfo -> String
show :: SetupInfo -> String
$cshowList :: [SetupInfo] -> ShowS
showList :: [SetupInfo] -> ShowS
Show, SetupInfo -> SetupInfo -> Bool
(SetupInfo -> SetupInfo -> Bool)
-> (SetupInfo -> SetupInfo -> Bool) -> Eq SetupInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SetupInfo -> SetupInfo -> Bool
== :: SetupInfo -> SetupInfo -> Bool
$c/= :: SetupInfo -> SetupInfo -> Bool
/= :: SetupInfo -> SetupInfo -> Bool
Eq, (forall x. SetupInfo -> Rep SetupInfo x)
-> (forall x. Rep SetupInfo x -> SetupInfo) -> Generic SetupInfo
forall x. Rep SetupInfo x -> SetupInfo
forall x. SetupInfo -> Rep SetupInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SetupInfo -> Rep SetupInfo x
from :: forall x. SetupInfo -> Rep SetupInfo x
$cto :: forall x. Rep SetupInfo x -> SetupInfo
to :: forall x. Rep SetupInfo x -> SetupInfo
GHC.Generic)

instance NFData SetupInfo

instance FromJSON SetupInfo where
  parseJSON :: Value -> Parser SetupInfo
parseJSON = String -> (Object -> Parser SetupInfo) -> Value -> Parser SetupInfo
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"SetupInfo" ((Object -> Parser SetupInfo) -> Value -> Parser SetupInfo)
-> (Object -> Parser SetupInfo) -> Value -> Parser SetupInfo
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Maybe DownloadInfo
siSevenzExe <- Object
o Object -> Key -> Parser (Maybe DownloadInfo)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sevenzexe-info"
    Maybe DownloadInfo
siSevenzDll <- Object
o Object -> Key -> Parser (Maybe DownloadInfo)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sevenzdll-info"
    Map Text VersionedDownloadInfo
siMsys2     <- Object
o Object -> Key -> Parser (Maybe (Map Text VersionedDownloadInfo))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"msys2"          Parser (Maybe (Map Text VersionedDownloadInfo))
-> Map Text VersionedDownloadInfo
-> Parser (Map Text VersionedDownloadInfo)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Map Text VersionedDownloadInfo
forall a. Monoid a => a
mempty
    Map Text (Map Version GHCDownloadInfo)
siGHCs      <- Object
o Object -> Key -> Parser (Map Text (Map Version GHCDownloadInfo))
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"ghc"
    Map Text (Map Version DownloadInfo)
siStack     <- Object
o Object
-> Key -> Parser (Maybe (Map Text (Map Version DownloadInfo)))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"stack"          Parser (Maybe (Map Text (Map Version DownloadInfo)))
-> Map Text (Map Version DownloadInfo)
-> Parser (Map Text (Map Version DownloadInfo))
forall a. Parser (Maybe a) -> a -> Parser a
.!= Map Text (Map Version DownloadInfo)
forall a. Monoid a => a
mempty
    SetupInfo -> Parser SetupInfo
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SetupInfo {Maybe DownloadInfo
Map Text (Map Version GHCDownloadInfo)
Map Text (Map Version DownloadInfo)
Map Text VersionedDownloadInfo
siSevenzExe :: Maybe DownloadInfo
siSevenzDll :: Maybe DownloadInfo
siMsys2 :: Map Text VersionedDownloadInfo
siGHCs :: Map Text (Map Version GHCDownloadInfo)
siStack :: Map Text (Map Version DownloadInfo)
siSevenzExe :: Maybe DownloadInfo
siSevenzDll :: Maybe DownloadInfo
siMsys2 :: Map Text VersionedDownloadInfo
siGHCs :: Map Text (Map Version GHCDownloadInfo)
siStack :: Map Text (Map Version DownloadInfo)
..}

instance ToJSON SetupInfo where
  toJSON :: SetupInfo -> Value
toJSON (SetupInfo {Maybe DownloadInfo
Map Text (Map Version GHCDownloadInfo)
Map Text (Map Version DownloadInfo)
Map Text VersionedDownloadInfo
siSevenzExe :: SetupInfo -> Maybe DownloadInfo
siSevenzDll :: SetupInfo -> Maybe DownloadInfo
siMsys2 :: SetupInfo -> Map Text VersionedDownloadInfo
siGHCs :: SetupInfo -> Map Text (Map Version GHCDownloadInfo)
siStack :: SetupInfo -> Map Text (Map Version DownloadInfo)
siSevenzExe :: Maybe DownloadInfo
siSevenzDll :: Maybe DownloadInfo
siMsys2 :: Map Text VersionedDownloadInfo
siGHCs :: Map Text (Map Version GHCDownloadInfo)
siStack :: Map Text (Map Version DownloadInfo)
..}) = [Pair] -> Value
object [ Key
"sevenzexe-info" Key -> Maybe DownloadInfo -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe DownloadInfo
siSevenzExe
                                   , Key
"sevenzdll-info" Key -> Maybe DownloadInfo -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe DownloadInfo
siSevenzDll
                                   , Key
"msys2"          Key -> Map Text VersionedDownloadInfo -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map Text VersionedDownloadInfo
siMsys2
                                   , Key
"ghc"            Key -> Map Text (Map Version GHCDownloadInfo) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map Text (Map Version GHCDownloadInfo)
siGHCs
                                   , Key
"stack"          Key -> Map Text (Map Version DownloadInfo) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map Text (Map Version DownloadInfo)
siStack
                                   ]

-- | 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 Maybe DownloadInfo -> Maybe DownloadInfo -> Maybe DownloadInfo
forall a. Maybe a -> Maybe a -> Maybe a
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 Maybe DownloadInfo -> Maybe DownloadInfo -> Maybe DownloadInfo
forall a. Maybe a -> Maybe a -> Maybe a
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 Map Text VersionedDownloadInfo
-> Map Text VersionedDownloadInfo -> Map Text VersionedDownloadInfo
forall a. Semigroup a => a -> a -> a
<> SetupInfo -> Map Text VersionedDownloadInfo
siMsys2 SetupInfo
r
    , siGHCs :: Map Text (Map Version GHCDownloadInfo)
siGHCs      = (Map Version GHCDownloadInfo
 -> Map Version GHCDownloadInfo -> Map Version GHCDownloadInfo)
-> Map Text (Map Version GHCDownloadInfo)
-> Map Text (Map Version GHCDownloadInfo)
-> Map Text (Map Version GHCDownloadInfo)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith Map Version GHCDownloadInfo
-> Map Version GHCDownloadInfo -> Map Version GHCDownloadInfo
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     = (Map Version DownloadInfo
 -> Map Version DownloadInfo -> Map Version DownloadInfo)
-> Map Text (Map Version DownloadInfo)
-> Map Text (Map Version DownloadInfo)
-> Map Text (Map Version DownloadInfo)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith Map Version DownloadInfo
-> Map Version DownloadInfo -> Map Version DownloadInfo
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 = Maybe DownloadInfo
forall a. Maybe a
Nothing
    , siSevenzDll :: Maybe DownloadInfo
siSevenzDll = Maybe DownloadInfo
forall a. Maybe a
Nothing
    , siMsys2 :: Map Text VersionedDownloadInfo
siMsys2     = Map Text VersionedDownloadInfo
forall k a. Map k a
Map.empty
    , siGHCs :: Map Text (Map Version GHCDownloadInfo)
siGHCs      = Map Text (Map Version GHCDownloadInfo)
forall k a. Map k a
Map.empty
    , siStack :: Map Text (Map Version DownloadInfo)
siStack     = Map Text (Map Version DownloadInfo)
forall k a. Map k a
Map.empty
    }
  mappend :: SetupInfo -> SetupInfo -> SetupInfo
mappend = SetupInfo -> SetupInfo -> SetupInfo
forall a. Semigroup a => a -> a -> a
(<>)

-- | Build of the compiler distribution (e.g. standard, gmp4, tinfo6)
-- | Information for a file to download.
data DownloadInfo = DownloadInfo
  { DownloadInfo -> Text
downloadInfoUrl           :: Text
    -- ^ URL or absolute file path
  , DownloadInfo -> Maybe Int
downloadInfoContentLength :: Maybe Int
  , DownloadInfo -> Maybe ByteString
downloadInfoSha1          :: Maybe ByteString
  , DownloadInfo -> Maybe ByteString
downloadInfoSha256        :: Maybe ByteString
  }
  deriving (Int -> DownloadInfo -> ShowS
[DownloadInfo] -> ShowS
DownloadInfo -> String
(Int -> DownloadInfo -> ShowS)
-> (DownloadInfo -> String)
-> ([DownloadInfo] -> ShowS)
-> Show DownloadInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DownloadInfo -> ShowS
showsPrec :: Int -> DownloadInfo -> ShowS
$cshow :: DownloadInfo -> String
show :: DownloadInfo -> String
$cshowList :: [DownloadInfo] -> ShowS
showList :: [DownloadInfo] -> ShowS
Show, DownloadInfo -> DownloadInfo -> Bool
(DownloadInfo -> DownloadInfo -> Bool)
-> (DownloadInfo -> DownloadInfo -> Bool) -> Eq DownloadInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DownloadInfo -> DownloadInfo -> Bool
== :: DownloadInfo -> DownloadInfo -> Bool
$c/= :: DownloadInfo -> DownloadInfo -> Bool
/= :: DownloadInfo -> DownloadInfo -> Bool
Eq, (forall x. DownloadInfo -> Rep DownloadInfo x)
-> (forall x. Rep DownloadInfo x -> DownloadInfo)
-> Generic DownloadInfo
forall x. Rep DownloadInfo x -> DownloadInfo
forall x. DownloadInfo -> Rep DownloadInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DownloadInfo -> Rep DownloadInfo x
from :: forall x. DownloadInfo -> Rep DownloadInfo x
$cto :: forall x. Rep DownloadInfo x -> DownloadInfo
to :: forall x. Rep DownloadInfo x -> DownloadInfo
GHC.Generic)

instance ToJSON DownloadInfo where
  toJSON :: DownloadInfo -> Value
toJSON (DownloadInfo {Maybe Int
Maybe ByteString
Text
downloadInfoUrl :: DownloadInfo -> Text
downloadInfoContentLength :: DownloadInfo -> Maybe Int
downloadInfoSha1 :: DownloadInfo -> Maybe ByteString
downloadInfoSha256 :: DownloadInfo -> Maybe ByteString
downloadInfoUrl :: Text
downloadInfoContentLength :: Maybe Int
downloadInfoSha1 :: Maybe ByteString
downloadInfoSha256 :: Maybe ByteString
..}) = [Pair] -> Value
object [ Key
"url"            Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
downloadInfoUrl
                                      , Key
"content-length" Key -> Maybe Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Int
downloadInfoContentLength
                                      , Key
"sha1"           Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha1)
                                      , Key
"sha256"         Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha256)
                                      ]

instance NFData DownloadInfo

instance FromJSON DownloadInfo where
  parseJSON :: Value -> Parser DownloadInfo
parseJSON = String
-> (Object -> Parser DownloadInfo) -> Value -> Parser DownloadInfo
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DownloadInfo" Object -> Parser DownloadInfo
parseDownloadInfoFromObject

-- | Parse JSON in existing object for 'DownloadInfo'
parseDownloadInfoFromObject :: Object -> Parser DownloadInfo
parseDownloadInfoFromObject :: Object -> Parser DownloadInfo
parseDownloadInfoFromObject Object
o = do
  Text
url           <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url"
  Maybe Int
contentLength <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"content-length"
  Maybe Text
sha1TextMay   <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sha1"
  Maybe Text
sha256TextMay <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sha256"
  DownloadInfo -> Parser DownloadInfo
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    DownloadInfo
    { downloadInfoUrl :: Text
downloadInfoUrl           = Text
url
    , downloadInfoContentLength :: Maybe Int
downloadInfoContentLength = Maybe Int
contentLength
    , downloadInfoSha1 :: Maybe ByteString
downloadInfoSha1          = (Text -> ByteString) -> Maybe Text -> Maybe ByteString
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> ByteString
encodeUtf8 Maybe Text
sha1TextMay
    , downloadInfoSha256 :: Maybe ByteString
downloadInfoSha256        = (Text -> ByteString) -> Maybe Text -> Maybe ByteString
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> ByteString
encodeUtf8 Maybe Text
sha256TextMay
    }

data VersionedDownloadInfo = VersionedDownloadInfo
  { VersionedDownloadInfo -> Version
vdiVersion      :: Version
  , VersionedDownloadInfo -> DownloadInfo
vdiDownloadInfo :: DownloadInfo
  }
  deriving (Int -> VersionedDownloadInfo -> ShowS
[VersionedDownloadInfo] -> ShowS
VersionedDownloadInfo -> String
(Int -> VersionedDownloadInfo -> ShowS)
-> (VersionedDownloadInfo -> String)
-> ([VersionedDownloadInfo] -> ShowS)
-> Show VersionedDownloadInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VersionedDownloadInfo -> ShowS
showsPrec :: Int -> VersionedDownloadInfo -> ShowS
$cshow :: VersionedDownloadInfo -> String
show :: VersionedDownloadInfo -> String
$cshowList :: [VersionedDownloadInfo] -> ShowS
showList :: [VersionedDownloadInfo] -> ShowS
Show, VersionedDownloadInfo -> VersionedDownloadInfo -> Bool
(VersionedDownloadInfo -> VersionedDownloadInfo -> Bool)
-> (VersionedDownloadInfo -> VersionedDownloadInfo -> Bool)
-> Eq VersionedDownloadInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: VersionedDownloadInfo -> VersionedDownloadInfo -> Bool
== :: VersionedDownloadInfo -> VersionedDownloadInfo -> Bool
$c/= :: VersionedDownloadInfo -> VersionedDownloadInfo -> Bool
/= :: VersionedDownloadInfo -> VersionedDownloadInfo -> Bool
Eq, (forall x. VersionedDownloadInfo -> Rep VersionedDownloadInfo x)
-> (forall x. Rep VersionedDownloadInfo x -> VersionedDownloadInfo)
-> Generic VersionedDownloadInfo
forall x. Rep VersionedDownloadInfo x -> VersionedDownloadInfo
forall x. VersionedDownloadInfo -> Rep VersionedDownloadInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. VersionedDownloadInfo -> Rep VersionedDownloadInfo x
from :: forall x. VersionedDownloadInfo -> Rep VersionedDownloadInfo x
$cto :: forall x. Rep VersionedDownloadInfo x -> VersionedDownloadInfo
to :: forall x. Rep VersionedDownloadInfo x -> VersionedDownloadInfo
GHC.Generic)

instance ToJSON VersionedDownloadInfo where
  toJSON :: VersionedDownloadInfo -> Value
toJSON (VersionedDownloadInfo {vdiDownloadInfo :: VersionedDownloadInfo -> DownloadInfo
vdiDownloadInfo = DownloadInfo{Maybe Int
Maybe ByteString
Text
downloadInfoUrl :: DownloadInfo -> Text
downloadInfoContentLength :: DownloadInfo -> Maybe Int
downloadInfoSha1 :: DownloadInfo -> Maybe ByteString
downloadInfoSha256 :: DownloadInfo -> Maybe ByteString
downloadInfoUrl :: Text
downloadInfoContentLength :: Maybe Int
downloadInfoSha1 :: Maybe ByteString
downloadInfoSha256 :: Maybe ByteString
..}, Version
vdiVersion :: VersionedDownloadInfo -> Version
vdiVersion :: Version
..})
    = [Pair] -> Value
object [ Key
"version"        Key -> Version -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Version
vdiVersion
             , Key
"url"            Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
downloadInfoUrl
             , Key
"content-length" Key -> Maybe Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Int
downloadInfoContentLength
             , Key
"sha1"           Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha1)
             , Key
"sha256"         Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha256)
             ]

instance NFData VersionedDownloadInfo

instance FromJSON VersionedDownloadInfo where
  parseJSON :: Value -> Parser VersionedDownloadInfo
parseJSON = String
-> (Object -> Parser VersionedDownloadInfo)
-> Value
-> Parser VersionedDownloadInfo
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"VersionedDownloadInfo" ((Object -> Parser VersionedDownloadInfo)
 -> Value -> Parser VersionedDownloadInfo)
-> (Object -> Parser VersionedDownloadInfo)
-> Value
-> Parser VersionedDownloadInfo
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Version
ver'         <- Object
o Object -> Key -> Parser Version
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"version"
    DownloadInfo
downloadInfo <- Object -> Parser DownloadInfo
parseDownloadInfoFromObject Object
o
    VersionedDownloadInfo -> Parser VersionedDownloadInfo
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure VersionedDownloadInfo
      { vdiVersion :: Version
vdiVersion      = Version
ver'
      , vdiDownloadInfo :: DownloadInfo
vdiDownloadInfo = DownloadInfo
downloadInfo
      }

data GHCDownloadInfo = GHCDownloadInfo
  { GHCDownloadInfo -> [Text]
gdiConfigureOpts :: [Text]
  , GHCDownloadInfo -> Map Text Text
gdiConfigureEnv  :: Map Text Text
  , GHCDownloadInfo -> DownloadInfo
gdiDownloadInfo  :: DownloadInfo
  }
  deriving (Int -> GHCDownloadInfo -> ShowS
[GHCDownloadInfo] -> ShowS
GHCDownloadInfo -> String
(Int -> GHCDownloadInfo -> ShowS)
-> (GHCDownloadInfo -> String)
-> ([GHCDownloadInfo] -> ShowS)
-> Show GHCDownloadInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GHCDownloadInfo -> ShowS
showsPrec :: Int -> GHCDownloadInfo -> ShowS
$cshow :: GHCDownloadInfo -> String
show :: GHCDownloadInfo -> String
$cshowList :: [GHCDownloadInfo] -> ShowS
showList :: [GHCDownloadInfo] -> ShowS
Show, GHCDownloadInfo -> GHCDownloadInfo -> Bool
(GHCDownloadInfo -> GHCDownloadInfo -> Bool)
-> (GHCDownloadInfo -> GHCDownloadInfo -> Bool)
-> Eq GHCDownloadInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GHCDownloadInfo -> GHCDownloadInfo -> Bool
== :: GHCDownloadInfo -> GHCDownloadInfo -> Bool
$c/= :: GHCDownloadInfo -> GHCDownloadInfo -> Bool
/= :: GHCDownloadInfo -> GHCDownloadInfo -> Bool
Eq, (forall x. GHCDownloadInfo -> Rep GHCDownloadInfo x)
-> (forall x. Rep GHCDownloadInfo x -> GHCDownloadInfo)
-> Generic GHCDownloadInfo
forall x. Rep GHCDownloadInfo x -> GHCDownloadInfo
forall x. GHCDownloadInfo -> Rep GHCDownloadInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. GHCDownloadInfo -> Rep GHCDownloadInfo x
from :: forall x. GHCDownloadInfo -> Rep GHCDownloadInfo x
$cto :: forall x. Rep GHCDownloadInfo x -> GHCDownloadInfo
to :: forall x. Rep GHCDownloadInfo x -> GHCDownloadInfo
GHC.Generic)

instance NFData GHCDownloadInfo

instance ToJSON GHCDownloadInfo where
  toJSON :: GHCDownloadInfo -> Value
toJSON (GHCDownloadInfo {gdiDownloadInfo :: GHCDownloadInfo -> DownloadInfo
gdiDownloadInfo = DownloadInfo {Maybe Int
Maybe ByteString
Text
downloadInfoUrl :: DownloadInfo -> Text
downloadInfoContentLength :: DownloadInfo -> Maybe Int
downloadInfoSha1 :: DownloadInfo -> Maybe ByteString
downloadInfoSha256 :: DownloadInfo -> Maybe ByteString
downloadInfoUrl :: Text
downloadInfoContentLength :: Maybe Int
downloadInfoSha1 :: Maybe ByteString
downloadInfoSha256 :: Maybe ByteString
..}, [Text]
Map Text Text
gdiConfigureOpts :: GHCDownloadInfo -> [Text]
gdiConfigureEnv :: GHCDownloadInfo -> Map Text Text
gdiConfigureOpts :: [Text]
gdiConfigureEnv :: Map Text Text
..})
    = [Pair] -> Value
object [ Key
"configure-opts" Key -> [Text] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Text]
gdiConfigureOpts
             , Key
"configure-env"  Key -> Map Text Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map Text Text
gdiConfigureEnv
             , Key
"url"            Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
downloadInfoUrl
             , Key
"content-length" Key -> Maybe Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Int
downloadInfoContentLength
             , Key
"sha1"           Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha1)
             , Key
"sha256"         Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (ByteString -> Text
decodeUtf8 (ByteString -> Text) -> Maybe ByteString -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
downloadInfoSha256)
             ]

instance FromJSON GHCDownloadInfo where
  parseJSON :: Value -> Parser GHCDownloadInfo
parseJSON = String
-> (Object -> Parser GHCDownloadInfo)
-> Value
-> Parser GHCDownloadInfo
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"GHCDownloadInfo" ((Object -> Parser GHCDownloadInfo)
 -> Value -> Parser GHCDownloadInfo)
-> (Object -> Parser GHCDownloadInfo)
-> Value
-> Parser GHCDownloadInfo
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    [Text]
configureOpts <- Object
o Object -> Key -> Parser (Maybe [Text])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"configure-opts" Parser (Maybe [Text]) -> [Text] -> Parser [Text]
forall a. Parser (Maybe a) -> a -> Parser a
.!= [Text]
forall a. Monoid a => a
mempty
    Map Text Text
configureEnv  <- Object
o Object -> Key -> Parser (Maybe (Map Text Text))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"configure-env"  Parser (Maybe (Map Text Text))
-> Map Text Text -> Parser (Map Text Text)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Map Text Text
forall a. Monoid a => a
mempty
    DownloadInfo
downloadInfo  <- Object -> Parser DownloadInfo
parseDownloadInfoFromObject Object
o
    GHCDownloadInfo -> Parser GHCDownloadInfo
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure GHCDownloadInfo
      { gdiConfigureOpts :: [Text]
gdiConfigureOpts = [Text]
configureOpts
      , gdiConfigureEnv :: Map Text Text
gdiConfigureEnv  = Map Text Text
configureEnv
      , gdiDownloadInfo :: DownloadInfo
gdiDownloadInfo  = DownloadInfo
downloadInfo
      }