module Hix.Managed.Cabal.Data.SolveTarget where

import Distribution.Client.Dependency (PackagePreference (..), PackageSpecifier (NamedPackage, SpecificSourcePackage))
import Distribution.Client.Types (UnresolvedSourcePackage)
import Distribution.Pretty (Pretty (pretty))
import Distribution.Solver.Types.PackageConstraint (dispPackageProperty)
import Distribution.Version (simplifyVersionRange)
import Text.PrettyPrint (Doc, (<+>))

import Hix.Pretty (prettyL)

data SolveTarget =
  SolveTarget {
    SolveTarget -> PackageSpecifier UnresolvedSourcePackage
dep :: PackageSpecifier UnresolvedSourcePackage,
    SolveTarget -> [PackagePreference]
prefs :: [PackagePreference]
  }

prettySpec :: PackageSpecifier UnresolvedSourcePackage -> Doc
prettySpec :: PackageSpecifier UnresolvedSourcePackage -> Doc
prettySpec = \case
  NamedPackage PackageName
name [PackageProperty]
prop ->
    Doc
"Named:" Doc -> Doc -> Doc
<+> PackageName -> Doc
forall a. Pretty a => a -> Doc
pretty PackageName
name Doc -> Doc -> Doc
<+> [Doc] -> Doc
forall (t :: * -> *) a. (Pretty a, Foldable t) => t a -> Doc
prettyL (PackageProperty -> Doc
dispPackageProperty (PackageProperty -> Doc) -> [PackageProperty] -> [Doc]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PackageProperty]
prop)
  SpecificSourcePackage UnresolvedSourcePackage
pkg ->
    Doc
"Source:" Doc -> Doc -> Doc
<+> UnresolvedSourcePackage -> Doc
forall b a. (Show a, IsString b) => a -> b
show UnresolvedSourcePackage
pkg

prettyPref :: PackagePreference -> Doc
prettyPref :: PackagePreference -> Doc
prettyPref = \case
  PackageVersionPreference   PackageName
pn VersionRange
vr ->
    PackageName -> Doc
forall a. Pretty a => a -> Doc
pretty PackageName
pn Doc -> Doc -> Doc
<+> VersionRange -> Doc
forall a. Pretty a => a -> Doc
pretty (VersionRange -> VersionRange
simplifyVersionRange VersionRange
vr)
  PackageInstalledPreference PackageName
pn InstalledPreference
ip ->
    PackageName -> Doc
forall a. Pretty a => a -> Doc
pretty PackageName
pn Doc -> Doc -> Doc
<+> InstalledPreference -> Doc
forall b a. (Show a, IsString b) => a -> b
show InstalledPreference
ip
  PackageStanzasPreference PackageName
pn [OptionalStanza]
st ->
    PackageName -> Doc
forall a. Pretty a => a -> Doc
pretty PackageName
pn Doc -> Doc -> Doc
<+> [OptionalStanza] -> Doc
forall b a. (Show a, IsString b) => a -> b
show [OptionalStanza]
st

instance Pretty SolveTarget where
  pretty :: SolveTarget -> Doc
pretty SolveTarget {[PackagePreference]
PackageSpecifier UnresolvedSourcePackage
dep :: SolveTarget -> PackageSpecifier UnresolvedSourcePackage
prefs :: SolveTarget -> [PackagePreference]
dep :: PackageSpecifier UnresolvedSourcePackage
prefs :: [PackagePreference]
..} =
    PackageSpecifier UnresolvedSourcePackage -> Doc
prettySpec PackageSpecifier UnresolvedSourcePackage
dep Doc -> Doc -> Doc
<+> [Doc] -> Doc
forall (t :: * -> *) a. (Pretty a, Foldable t) => t a -> Doc
prettyL (PackagePreference -> Doc
prettyPref (PackagePreference -> Doc) -> [PackagePreference] -> [Doc]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PackagePreference]
prefs)