module Hix.Data.Overrides where

import Data.Aeson (FromJSON (parseJSON), withObject, (.:))
import Distribution.Pretty (Pretty (pretty))
import Distribution.Types.Version (Version)
import GHC.Exts (IsList)
import Text.PrettyPrint (brackets, (<+>))

import Hix.Class.EncodeNix (EncodeNix)
import Hix.Class.Map (LookupMaybe, NMap, nPretty)
import Hix.Data.Json (JsonParsec (JsonParsec))
import Hix.Data.PackageName (PackageName)
import Hix.Data.Version (SourceHash)

data Override =
  Override {
    Override -> Version
version :: Version,
    Override -> SourceHash
hash :: SourceHash
  }
  deriving stock (Override -> Override -> Bool
(Override -> Override -> Bool)
-> (Override -> Override -> Bool) -> Eq Override
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Override -> Override -> Bool
== :: Override -> Override -> Bool
$c/= :: Override -> Override -> Bool
/= :: Override -> Override -> Bool
Eq, Int -> Override -> ShowS
[Override] -> ShowS
Override -> String
(Int -> Override -> ShowS)
-> (Override -> String) -> ([Override] -> ShowS) -> Show Override
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Override -> ShowS
showsPrec :: Int -> Override -> ShowS
$cshow :: Override -> String
show :: Override -> String
$cshowList :: [Override] -> ShowS
showList :: [Override] -> ShowS
Show, (forall x. Override -> Rep Override x)
-> (forall x. Rep Override x -> Override) -> Generic Override
forall x. Rep Override x -> Override
forall x. Override -> Rep Override x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Override -> Rep Override x
from :: forall x. Override -> Rep Override x
$cto :: forall x. Rep Override x -> Override
to :: forall x. Rep Override x -> Override
Generic)
  deriving anyclass (Override -> Expr
(Override -> Expr) -> EncodeNix Override
forall a. (a -> Expr) -> EncodeNix a
$cencodeNix :: Override -> Expr
encodeNix :: Override -> Expr
EncodeNix)

instance FromJSON Override where
  parseJSON :: Value -> Parser Override
parseJSON =
    String -> (Object -> Parser Override) -> Value -> Parser Override
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Override" \ Object
o -> do
      JsonParsec Version
version <- Object
o Object -> Key -> Parser (JsonParsec Version)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"version"
      SourceHash
hash <- Object
o Object -> Key -> Parser SourceHash
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"hash"
      pure Override {Version
SourceHash
version :: Version
hash :: SourceHash
version :: Version
hash :: SourceHash
..}

instance Pretty Override where
  pretty :: Override -> Doc
pretty Override {Version
SourceHash
version :: Override -> Version
hash :: Override -> SourceHash
version :: Version
hash :: SourceHash
..} = Version -> Doc
forall a. Pretty a => a -> Doc
pretty Version
version Doc -> Doc -> Doc
<+> Doc -> Doc
brackets (SourceHash -> Doc
forall a. Pretty a => a -> Doc
pretty SourceHash
hash)

-- | Overrides can be either for mutable (direct, nonlocal) deps, or for transitive deps, so they must use
-- 'PackageName'.
newtype Overrides =
  Overrides (Map PackageName Override)
  deriving stock (Overrides -> Overrides -> Bool
(Overrides -> Overrides -> Bool)
-> (Overrides -> Overrides -> Bool) -> Eq Overrides
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Overrides -> Overrides -> Bool
== :: Overrides -> Overrides -> Bool
$c/= :: Overrides -> Overrides -> Bool
/= :: Overrides -> Overrides -> Bool
Eq, Int -> Overrides -> ShowS
[Overrides] -> ShowS
Overrides -> String
(Int -> Overrides -> ShowS)
-> (Overrides -> String)
-> ([Overrides] -> ShowS)
-> Show Overrides
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Overrides -> ShowS
showsPrec :: Int -> Overrides -> ShowS
$cshow :: Overrides -> String
show :: Overrides -> String
$cshowList :: [Overrides] -> ShowS
showList :: [Overrides] -> ShowS
Show, (forall x. Overrides -> Rep Overrides x)
-> (forall x. Rep Overrides x -> Overrides) -> Generic Overrides
forall x. Rep Overrides x -> Overrides
forall x. Overrides -> Rep Overrides x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Overrides -> Rep Overrides x
from :: forall x. Overrides -> Rep Overrides x
$cto :: forall x. Rep Overrides x -> Overrides
to :: forall x. Rep Overrides x -> Overrides
Generic)
  deriving newtype (Maybe Overrides
Value -> Parser [Overrides]
Value -> Parser Overrides
(Value -> Parser Overrides)
-> (Value -> Parser [Overrides])
-> Maybe Overrides
-> FromJSON Overrides
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser Overrides
parseJSON :: Value -> Parser Overrides
$cparseJSONList :: Value -> Parser [Overrides]
parseJSONList :: Value -> Parser [Overrides]
$comittedField :: Maybe Overrides
omittedField :: Maybe Overrides
FromJSON, NonEmpty Overrides -> Overrides
Overrides -> Overrides -> Overrides
(Overrides -> Overrides -> Overrides)
-> (NonEmpty Overrides -> Overrides)
-> (forall b. Integral b => b -> Overrides -> Overrides)
-> Semigroup Overrides
forall b. Integral b => b -> Overrides -> Overrides
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: Overrides -> Overrides -> Overrides
<> :: Overrides -> Overrides -> Overrides
$csconcat :: NonEmpty Overrides -> Overrides
sconcat :: NonEmpty Overrides -> Overrides
$cstimes :: forall b. Integral b => b -> Overrides -> Overrides
stimes :: forall b. Integral b => b -> Overrides -> Overrides
Semigroup, Semigroup Overrides
Overrides
Semigroup Overrides =>
Overrides
-> (Overrides -> Overrides -> Overrides)
-> ([Overrides] -> Overrides)
-> Monoid Overrides
[Overrides] -> Overrides
Overrides -> Overrides -> Overrides
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: Overrides
mempty :: Overrides
$cmappend :: Overrides -> Overrides -> Overrides
mappend :: Overrides -> Overrides -> Overrides
$cmconcat :: [Overrides] -> Overrides
mconcat :: [Overrides] -> Overrides
Monoid, Int -> [Item Overrides] -> Overrides
[Item Overrides] -> Overrides
Overrides -> [Item Overrides]
([Item Overrides] -> Overrides)
-> (Int -> [Item Overrides] -> Overrides)
-> (Overrides -> [Item Overrides])
-> IsList Overrides
forall l.
([Item l] -> l)
-> (Int -> [Item l] -> l) -> (l -> [Item l]) -> IsList l
$cfromList :: [Item Overrides] -> Overrides
fromList :: [Item Overrides] -> Overrides
$cfromListN :: Int -> [Item Overrides] -> Overrides
fromListN :: Int -> [Item Overrides] -> Overrides
$ctoList :: Overrides -> [Item Overrides]
toList :: Overrides -> [Item Overrides]
IsList, Overrides -> Expr
(Overrides -> Expr) -> EncodeNix Overrides
forall a. (a -> Expr) -> EncodeNix a
$cencodeNix :: Overrides -> Expr
encodeNix :: Overrides -> Expr
EncodeNix)

instance NMap Overrides PackageName Override LookupMaybe where

instance Pretty Overrides where
  pretty :: Overrides -> Doc
pretty = Overrides -> Doc
forall k v map sort.
(Pretty k, Pretty v, NMap map k v sort) =>
map -> Doc
nPretty