hix-0.7.0: lib/Hix/Managed/Data/ManagedPackageProto.hs
module Hix.Managed.Data.ManagedPackageProto where
import Data.Aeson (FromJSON (parseJSON), withObject, (.:))
import Data.List.Extra (nubOrdOn)
import qualified Data.Map.Strict as Map
import Distribution.Pretty (Pretty (pretty))
import Text.PrettyPrint (brackets, (<+>))
import Hix.Class.Map (nFromList)
import qualified Hix.Data.Dep
import Hix.Data.Dep (Dep)
import Hix.Data.Json (jsonParsec)
import qualified Hix.Data.PackageId
import Hix.Data.PackageId (PackageId (PackageId))
import Hix.Data.PackageName (LocalPackage (LocalPackage))
import Hix.Data.Version (Version)
import Hix.Managed.Data.Packages (Packages)
import Hix.Pretty (prettyL)
data ManagedPackageProto =
ManagedPackageProto {
name :: LocalPackage,
version :: Version,
deps :: [Dep]
}
deriving stock (Eq, Show, Generic)
instance Pretty ManagedPackageProto where
pretty ManagedPackageProto {..} = pretty PackageId {name = coerce name, version} <+> brackets (prettyL deps)
instance FromJSON ManagedPackageProto where
parseJSON =
withObject "ManagedPackageProto" \ o -> do
name <- o .: "name"
version <- jsonParsec <$> o .: "version"
deps <- nubOrdOn (.package) <$> o .: "deps"
pure ManagedPackageProto {..}
managedPackages :: Map (LocalPackage, Version) [Dep] -> Packages ManagedPackageProto
managedPackages spec =
nFromList (pkg <$> Map.toList spec)
where
pkg ((name, version), deps) =
(name, ManagedPackageProto {name, version, deps})