module Hix.Managed.Data.MutableId where

import Data.Aeson (ToJSON (toJSON), object, (.=))
import Distribution.Pretty (Pretty (pretty))
import Distribution.Version (Version)

import qualified Hix.Data.PackageId
import Hix.Data.PackageId (PackageId (PackageId))
import Hix.Managed.Data.Mutable (MutableDep (MutableDep))
import Hix.Pretty (showP)

data MutableId =
  MutableId {
    MutableId -> MutableDep
name :: MutableDep,
    MutableId -> Version
version :: Version
  }
  deriving stock (MutableId -> MutableId -> Bool
(MutableId -> MutableId -> Bool)
-> (MutableId -> MutableId -> Bool) -> Eq MutableId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MutableId -> MutableId -> Bool
== :: MutableId -> MutableId -> Bool
$c/= :: MutableId -> MutableId -> Bool
/= :: MutableId -> MutableId -> Bool
Eq, Int -> MutableId -> ShowS
[MutableId] -> ShowS
MutableId -> String
(Int -> MutableId -> ShowS)
-> (MutableId -> String)
-> ([MutableId] -> ShowS)
-> Show MutableId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MutableId -> ShowS
showsPrec :: Int -> MutableId -> ShowS
$cshow :: MutableId -> String
show :: MutableId -> String
$cshowList :: [MutableId] -> ShowS
showList :: [MutableId] -> ShowS
Show, (forall x. MutableId -> Rep MutableId x)
-> (forall x. Rep MutableId x -> MutableId) -> Generic MutableId
forall x. Rep MutableId x -> MutableId
forall x. MutableId -> Rep MutableId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. MutableId -> Rep MutableId x
from :: forall x. MutableId -> Rep MutableId x
$cto :: forall x. Rep MutableId x -> MutableId
to :: forall x. Rep MutableId x -> MutableId
Generic)

toPackageId :: MutableId -> PackageId
toPackageId :: MutableId -> PackageId
toPackageId MutableId {name :: MutableId -> MutableDep
name = MutableDep PackageName
name, Version
version :: MutableId -> Version
version :: Version
version} =
  PackageId {PackageName
name :: PackageName
name :: PackageName
name, Version
version :: Version
version :: Version
version}

instance Pretty MutableId where
  pretty :: MutableId -> Doc
pretty = PackageId -> Doc
forall a. Pretty a => a -> Doc
pretty (PackageId -> Doc) -> (MutableId -> PackageId) -> MutableId -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MutableId -> PackageId
toPackageId

instance ToJSON MutableId where
  toJSON :: MutableId -> Value
toJSON MutableId {Version
MutableDep
name :: MutableId -> MutableDep
version :: MutableId -> Version
name :: MutableDep
version :: Version
..} =
    [Pair] -> Value
object [Key
"name" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= MutableDep -> Value
forall a. ToJSON a => a -> Value
toJSON MutableDep
name, Key
"version" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Version -> Text
forall b a. (Pretty a, IsString b) => a -> b
showP Version
version :: Text)]