packages feed

hix-0.9.0: lib/Hix/Managed/Maint/Data/MaintResult.hs

module Hix.Managed.Maint.Data.MaintResult where

import Data.Aeson (ToJSON (toJSON))
import Distribution.Pretty (Pretty (pretty))
import Exon (exon)
import Text.PrettyPrint (brackets, hang, parens, text, vcat, (<+>))

import Hix.Data.PackageName (LocalPackage (..))
import Hix.Managed.Cabal.Data.Revision (Revision (..))
import Hix.Managed.Data.BuildOutput (ModifiedId (..))
import Hix.Managed.Git (BranchName)
import Hix.Pretty (hpretty)

data NoPublishReason =
  NoDirectDepUpdates
  |
  NoRangeUpdates
  |
  PublishDisabled
  deriving stock (Eq, Show)

instance Pretty NoPublishReason where
  pretty = \case
    NoDirectDepUpdates -> text "no direct dep updates"
    NoRangeUpdates -> text "no range updates"
    PublishDisabled -> text "publishing disabled by config"

data UpdateAction =
  OnlyCommit NoPublishReason
  |
  PublishRevision
  deriving stock (Eq, Show)

instance Pretty UpdateAction where
  pretty = \case
    OnlyCommit reason -> text "only commit" <+> parens (pretty reason)
    PublishRevision -> text "publish revision"

data MaintStatus =
  BumpFailure
  |
  NoChanges
  |
  UpdatedVersions UpdateAction (NonEmpty ModifiedId)
  deriving stock (Eq, Show)

instance Pretty MaintStatus where
  pretty = \case
    BumpFailure -> text "bump failure"
    NoChanges -> text "no changes"
    UpdatedVersions action modified ->
      hang (text "updated versions:") 2 (vcat [text "action:" <+> pretty action, "modified:" <+> hpretty modified])

data UnchangedReason =
  NoTags
  |
  NoUpdates
  |
  CannotProceed Text
  deriving stock (Eq, Show)

instance Pretty UnchangedReason where
  pretty = \case
    NoTags -> "No release tags found for this package"
    NoUpdates -> "All dependencies are up to date"
    CannotProceed msg -> [exon|Error: #{text (toString msg)}|]

data MaintChanged =
  Modified NoPublishReason
  |
  Published Revision
  deriving stock (Eq, Show, Generic)

instance ToJSON MaintChanged where
  toJSON = \case
    Modified _ -> toJSON ("modified" :: Text)
    Published _ -> toJSON ("published" :: Text)

instance Pretty MaintChanged where
  pretty = \case
    Modified reason -> text "Modified:" <+> pretty reason
    Published Revision {number} -> text "Published revision" <+> hpretty number

data MaintResult =
  Unchanged UnchangedReason
  |
  Changed {
    branch :: BranchName,
    baseBranch :: BranchName,
    resolution :: MaintChanged
  }
  deriving stock (Eq, Show, Generic)

instance Pretty MaintResult where
  pretty = \case
    Unchanged reason ->
      text "Unchanged:" <+> pretty reason
    Changed {..} ->
      pretty resolution <+> brackets (pretty branch)

data ChangedPackage =
  ChangedPackage {
    package :: LocalPackage,
    branch :: BranchName,
    baseBranch :: BranchName,
    message :: Text
  }
  deriving stock (Eq, Show, Generic)
  deriving anyclass (ToJSON)

data FailedPackage =
  FailedPackage {
    package :: LocalPackage,
    message :: Text
  }
  deriving stock (Eq, Show, Generic)
  deriving anyclass (ToJSON)

data MaintOutput =
  MaintOutput {
    changes :: [ChangedPackage],
    failures :: [FailedPackage]
  }
  deriving stock (Eq, Show, Generic)
  deriving anyclass (ToJSON)