{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Stack.Types.VersionedDownloadInfo
  ( VersionedDownloadInfo (..)
  ) where

import           Pantry.Internal.AesonExtended
                   ( FromJSON (..), WithJSONWarnings (..), (..:)
                   , withObjectWarnings
                   )
import           Stack.Prelude
import           Stack.Types.DownloadInfo
                   ( DownloadInfo, parseDownloadInfoFromObject )

data VersionedDownloadInfo = VersionedDownloadInfo
  { VersionedDownloadInfo -> Version
vdiVersion :: Version
  , VersionedDownloadInfo -> DownloadInfo
vdiDownloadInfo :: DownloadInfo
  }
  deriving Int -> VersionedDownloadInfo -> ShowS
[VersionedDownloadInfo] -> ShowS
VersionedDownloadInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VersionedDownloadInfo] -> ShowS
$cshowList :: [VersionedDownloadInfo] -> ShowS
show :: VersionedDownloadInfo -> String
$cshow :: VersionedDownloadInfo -> String
showsPrec :: Int -> VersionedDownloadInfo -> ShowS
$cshowsPrec :: Int -> VersionedDownloadInfo -> ShowS
Show

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