{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}

-- | Copyright: (c) 2020-2021 berberman
-- SPDX-License-Identifier: MIT
-- Maintainer: berberman <berberman@yandex.com>
-- Stability: experimental
-- Portability: portable
-- This module provides simple pretty-printing functions work with the cli program.
module Distribution.ArchHs.PP
  ( prettySkip,
    prettyFlagAssignments,
    prettyFlags,
    prettySolvedPkgs,
    prettyDeps,
    ppSysDependencies,
    ppDiffColored,
    align2col,
    dui,
    cuo,
    yellowStarInParens,
    ppExtra,
    ppAur,
    ppDBKind,
    annYellow,
    annGreen,
    annMagneta,
    annRed,
    annBold,
    annCyan,
    annBlue,
    render,
    viaPretty,
    splitLine,
    ppFromTo,
    printInfo,
    printWarn,
    printError,
    printSuccess,
    module Prettyprinter,
    module Prettyprinter.Render.Terminal,
  )
where

import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Algorithm.Diff
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import Distribution.ArchHs.FilesDB (DBKind)
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Types
import qualified Distribution.Pretty as DPretty
import Prettyprinter
import Prettyprinter.Render.Terminal

annYellow :: Doc AnsiStyle -> Doc AnsiStyle
annYellow :: Doc AnsiStyle -> Doc AnsiStyle
annYellow = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Yellow)

annCyan :: Doc AnsiStyle -> Doc AnsiStyle
annCyan :: Doc AnsiStyle -> Doc AnsiStyle
annCyan = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Cyan)

annMagneta :: Doc AnsiStyle -> Doc AnsiStyle
annMagneta :: Doc AnsiStyle -> Doc AnsiStyle
annMagneta = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Magenta)

annRed :: Doc AnsiStyle -> Doc AnsiStyle
annRed :: Doc AnsiStyle -> Doc AnsiStyle
annRed = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Red)

annGreen :: Doc AnsiStyle -> Doc AnsiStyle
annGreen :: Doc AnsiStyle -> Doc AnsiStyle
annGreen = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Green)

annBold :: Doc AnsiStyle -> Doc AnsiStyle
annBold :: Doc AnsiStyle -> Doc AnsiStyle
annBold = forall ann. ann -> Doc ann -> Doc ann
annotate AnsiStyle
bold

annBlue :: Doc AnsiStyle -> Doc AnsiStyle
annBlue :: Doc AnsiStyle -> Doc AnsiStyle
annBlue = forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Blue)

cuo :: Doc AnsiStyle
cuo :: Doc AnsiStyle
cuo = Doc AnsiStyle -> Doc AnsiStyle
annRed Doc AnsiStyle
"✘"

dui :: Doc AnsiStyle
dui :: Doc AnsiStyle
dui = Doc AnsiStyle -> Doc AnsiStyle
annGreen Doc AnsiStyle
"✔"

yellowStarInParens :: Doc AnsiStyle
yellowStarInParens :: Doc AnsiStyle
yellowStarInParens = Doc AnsiStyle -> Doc AnsiStyle
annYellow forall a b. (a -> b) -> a -> b
$ forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Char
'*')

prettySkip :: [String] -> Doc AnsiStyle
prettySkip :: [[Char]] -> Doc AnsiStyle
prettySkip = forall ann. [Doc ann] -> Doc ann
hsep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate forall ann. Doc ann
comma forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Magenta) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty)

prettyFlagAssignments :: Map.Map PackageName FlagAssignment -> Doc AnsiStyle
prettyFlagAssignments :: Map PackageName FlagAssignment -> Doc AnsiStyle
prettyFlagAssignments Map PackageName FlagAssignment
m =
  forall ann. [Doc ann] -> Doc ann
vsep forall a b. (a -> b) -> a -> b
$
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(PackageName
n, FlagAssignment
a) -> Doc AnsiStyle -> Doc AnsiStyle
annMagneta (forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
n) forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line forall a. Semigroup a => a -> a -> a
<> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment FlagAssignment
a))) forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName FlagAssignment
m

prettyFlagAssignment :: FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment :: FlagAssignment -> Doc AnsiStyle
prettyFlagAssignment = forall ann. [Doc ann] -> Doc ann
vsep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(FlagName
n, Bool
v) -> Doc AnsiStyle
"⚐" forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Yellow) (forall a. Pretty a => a -> Doc AnsiStyle
viaPretty FlagName
n) forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. ann -> Doc ann -> Doc ann
annotate (Color -> AnsiStyle
color Color
Cyan) (forall a ann. Pretty a => a -> Doc ann
pretty Bool
v)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. FlagAssignment -> [(FlagName, Bool)]
unFlagAssignment

prettyDeps :: [(PackageName, Bool)] -> Doc AnsiStyle
prettyDeps :: [(PackageName, Bool)] -> Doc AnsiStyle
prettyDeps =
  forall ann. [Doc ann] -> Doc ann
vsep
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
      ( \(Int
i :: Int, (PackageName
pkg, Bool
star)) ->
          forall a ann. Pretty a => a -> Doc ann
pretty Int
i
            forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
dot forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
pkg
            forall a. Semigroup a => a -> a -> a
<> ( if Bool
star
                   then forall ann. Doc ann
space forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
yellowStarInParens
                   else forall a. Monoid a => a
mempty
               )
      )
    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..]

prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle
prettyFlags :: [(PackageName, [PkgFlag])] -> Doc AnsiStyle
prettyFlags = forall ann. [Doc ann] -> Doc ann
vsep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(PackageName
name, [PkgFlag]
flags) -> Doc AnsiStyle -> Doc AnsiStyle
annMagneta (forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
name) forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line forall a. Semigroup a => a -> a -> a
<> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (forall ann. [Doc ann] -> Doc ann
vsep (PkgFlag -> Doc AnsiStyle
prettyFlag forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PkgFlag]
flags)))

prettyFlag :: PkgFlag -> Doc AnsiStyle
prettyFlag :: PkgFlag -> Doc AnsiStyle
prettyFlag PkgFlag
f =
  Doc AnsiStyle
"⚐" forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annYellow Doc AnsiStyle
name forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line
    forall a. Semigroup a => a -> a -> a
<> forall ann. Int -> Doc ann -> Doc ann
indent
      Int
4
      ( forall ann. [Doc ann] -> Doc ann
vsep
          [ Doc AnsiStyle
"description" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line forall a. Semigroup a => a -> a -> a
<> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc AnsiStyle
desc,
            Doc AnsiStyle
"default" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
def,
            Doc AnsiStyle
"isManual" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
manual
          ]
      )
  where
    name :: Doc AnsiStyle
name = forall a. Pretty a => a -> Doc AnsiStyle
viaPretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. PkgFlag -> FlagName
flagName forall a b. (a -> b) -> a -> b
$ PkgFlag
f
    desc :: Doc AnsiStyle
desc = forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ PkgFlag -> [Char]
flagDescription PkgFlag
f
    def :: Doc AnsiStyle
def = forall a ann. Show a => a -> Doc ann
viaShow forall a b. (a -> b) -> a -> b
$ PkgFlag -> Bool
flagDefault PkgFlag
f
    manual :: Doc AnsiStyle
manual = forall a ann. Show a => a -> Doc ann
viaShow forall a b. (a -> b) -> a -> b
$ PkgFlag -> Bool
flagManual PkgFlag
f

prettySolvedPkgs :: [SolvedPackage] -> T.Text
prettySolvedPkgs :: [SolvedPackage] -> Text
prettySolvedPkgs = [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg

prettySolvedPkg :: SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg :: SolvedPackage -> [(Doc AnsiStyle, Doc AnsiStyle)]
prettySolvedPkg SolvedPackage {[SolvedDependency]
PackageName
_pkgDeps :: SolvedPackage -> [SolvedDependency]
_pkgName :: SolvedPackage -> PackageName
_pkgDeps :: [SolvedDependency]
_pkgName :: PackageName
..} =
  (Doc AnsiStyle -> Doc AnsiStyle
annYellow forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBold forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Pretty a => a -> Doc AnsiStyle
viaPretty forall a b. (a -> b) -> a -> b
$ PackageName
_pkgName, forall ann. Int -> Doc ann -> Doc ann
indent Int
16 Doc AnsiStyle
cuo) forall a. a -> [a] -> [a]
:
  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
    ( \(Int
i :: Int, SolvedDependency {[DependencyType]
Maybe DependencyProvider
PackageName
_depType :: SolvedDependency -> [DependencyType]
_depName :: SolvedDependency -> PackageName
_depProvider :: SolvedDependency -> Maybe DependencyProvider
_depType :: [DependencyType]
_depName :: PackageName
_depProvider :: Maybe DependencyProvider
..}) ->
        let prefix :: Doc AnsiStyle
prefix = if Int
i forall a. Eq a => a -> a -> Bool
== forall (t :: * -> *) a. Foldable t => t a -> Int
length [SolvedDependency]
_pkgDeps then Doc AnsiStyle
" └─" else Doc AnsiStyle
" ├─"
         in case Maybe DependencyProvider
_depProvider of
              (Just DependencyProvider
x) -> (Doc AnsiStyle -> Doc AnsiStyle
annGreen forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
prefix forall a. Semigroup a => a -> a -> a
<> forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_depName forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
parens (forall ann. [Doc ann] -> Doc ann
hsep forall a b. (a -> b) -> a -> b
$ forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate forall ann. Doc ann
comma (forall a ann. Show a => a -> Doc ann
viaShow forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DependencyType]
_depType)), Doc AnsiStyle
dui forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annCyan (forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
x))
              Maybe DependencyProvider
_ -> (Doc AnsiStyle -> Doc AnsiStyle
annYellow forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBold forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
prefix forall a. Semigroup a => a -> a -> a
<> forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_depName forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
parens (forall ann. [Doc ann] -> Doc ann
hsep forall a b. (a -> b) -> a -> b
$ forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate forall ann. Doc ann
comma (forall a ann. Show a => a -> Doc ann
viaShow forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DependencyType]
_depType)), forall ann. Int -> Doc ann -> Doc ann
indent Int
16 Doc AnsiStyle
cuo)
    )
    (forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..] [SolvedDependency]
_pkgDeps)
prettySolvedPkg ProvidedPackage {PackageName
DependencyProvider
_pkgProvider :: SolvedPackage -> DependencyProvider
_pkgProvider :: DependencyProvider
_pkgName :: PackageName
_pkgName :: SolvedPackage -> PackageName
..} = [(Doc AnsiStyle -> Doc AnsiStyle
annGreen forall a b. (a -> b) -> a -> b
$ forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
_pkgName, Doc AnsiStyle
dui forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle -> Doc AnsiStyle
annCyan (forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
_pkgProvider))]

render :: Doc AnsiStyle -> T.Text
render :: Doc AnsiStyle -> Text
render = SimpleDocStream AnsiStyle -> Text
renderStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutPretty LayoutOptions
defaultLayoutOptions

viaPretty :: DPretty.Pretty a => a -> Doc AnsiStyle
viaPretty :: forall a. Pretty a => a -> Doc AnsiStyle
viaPretty = forall a ann. Pretty a => a -> Doc ann
pretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Pretty a => a -> [Char]
prettyShow

align2col :: [(Doc AnsiStyle, Doc AnsiStyle)] -> T.Text
align2col :: [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. Traversal (a, a) (b, b) a b
both forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Doc AnsiStyle -> Text
render) -> [(Text, Text)]
l) = [Text] -> Text
T.concat [Text]
complemented
  where
    maxL :: Int
maxL = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> Int
T.length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(Text, Text)]
l
    complemented :: [Text]
complemented = (\(Text
x, Text
y) -> Text
x forall a. Semigroup a => a -> a -> a
<> Int -> Text -> Text
T.replicate (Int
maxL forall a. Num a => a -> a -> a
- Text -> Int
T.length Text
x) Text
" " forall a. Semigroup a => a -> a -> a
<> Text
y forall a. Semigroup a => a -> a -> a
<> Text
"\n") forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(Text, Text)]
l

ppSysDependencies :: Map.Map PackageName [SystemDependency] -> T.Text
ppSysDependencies :: Map PackageName [SystemDependency] -> Text
ppSysDependencies Map PackageName [SystemDependency]
m = [(Doc AnsiStyle, Doc AnsiStyle)] -> Text
align2col forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName [SystemDependency]
m

ppSysDependency :: PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency :: PackageName -> [SystemDependency] -> (Doc AnsiStyle, Doc AnsiStyle)
ppSysDependency PackageName
name [SystemDependency]
deps = ((Doc AnsiStyle -> Doc AnsiStyle
annBold forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annYellow forall a b. (a -> b) -> a -> b
$ forall a. Pretty a => a -> Doc AnsiStyle
viaPretty PackageName
name) forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon, forall ann. [Doc ann] -> Doc ann
hsep forall a b. (a -> b) -> a -> b
$ forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate forall ann. Doc ann
comma (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(SystemDependency [Char]
x) -> forall a ann. Pretty a => a -> Doc ann
pretty [Char]
x) [SystemDependency]
deps))

ppDiffColored :: Diff [String] -> [Doc AnsiStyle]
ppDiffColored :: Diff [[Char]] -> [Doc AnsiStyle]
ppDiffColored (First [[Char]]
x) = Doc AnsiStyle -> Doc AnsiStyle
annRed forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[Char]]
x
ppDiffColored (Second [[Char]]
x) = Doc AnsiStyle -> Doc AnsiStyle
annGreen forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[Char]]
x
ppDiffColored (Both [[Char]]
x [[Char]]
_) = forall a ann. Pretty a => a -> Doc ann
pretty forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[Char]]
x

splitLine :: Doc AnsiStyle
splitLine :: Doc AnsiStyle
splitLine = forall ann. Doc ann
line forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty (forall a. Int -> a -> [a]
replicate Int
38 Char
'-') forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line

ppFromTo :: Int -> Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
ppFromTo :: Int -> Doc AnsiStyle -> Doc AnsiStyle -> Doc AnsiStyle
ppFromTo Int
i Doc AnsiStyle
a Doc AnsiStyle
b = Doc AnsiStyle
a forall a. Semigroup a => a -> a -> a
<> forall ann. [Doc ann] -> Doc ann
hcat (forall a. Int -> a -> [a]
replicate Int
i forall ann. Doc ann
space) forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
"⇒" forall a. Semigroup a => a -> a -> a
<> forall ann. [Doc ann] -> Doc ann
hcat (forall a. Int -> a -> [a]
replicate Int
i forall ann. Doc ann
space) forall a. Semigroup a => a -> a -> a
<> Doc AnsiStyle
b

printInfo :: (MonadIO m) => Doc AnsiStyle -> m ()
printInfo :: forall (m :: * -> *). MonadIO m => Doc AnsiStyle -> m ()
printInfo Doc AnsiStyle
msg = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annBlue forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"ⓘ" forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line

ppExtra :: Doc AnsiStyle
ppExtra :: Doc AnsiStyle
ppExtra = Doc AnsiStyle -> Doc AnsiStyle
annCyan forall a b. (a -> b) -> a -> b
$ forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
ByExtra

ppDBKind :: DBKind -> Doc AnsiStyle
ppDBKind :: DBKind -> Doc AnsiStyle
ppDBKind DBKind
x = Doc AnsiStyle -> Doc AnsiStyle
annCyan forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. Doc ann -> Doc ann
brackets forall a b. (a -> b) -> a -> b
$ forall a ann. Show a => a -> Doc ann
viaShow DBKind
x

ppAur :: Doc AnsiStyle
ppAur :: Doc AnsiStyle
ppAur = Doc AnsiStyle -> Doc AnsiStyle
annCyan forall a b. (a -> b) -> a -> b
$ forall a ann. Show a => a -> Doc ann
viaShow DependencyProvider
ByAur

printWarn :: (MonadIO m) => Doc AnsiStyle -> m ()
printWarn :: forall (m :: * -> *). MonadIO m => Doc AnsiStyle -> m ()
printWarn Doc AnsiStyle
msg = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annYellow forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"⚠" forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line

printError :: (MonadIO m) => Doc AnsiStyle -> m ()
printError :: forall (m :: * -> *). MonadIO m => Doc AnsiStyle -> m ()
printError Doc AnsiStyle
msg = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annRed forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
"🛑" forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line

printSuccess :: (MonadIO m) => Doc AnsiStyle -> m ()
printSuccess :: forall (m :: * -> *). MonadIO m => Doc AnsiStyle -> m ()
printSuccess Doc AnsiStyle
msg = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> IO ()
putDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc AnsiStyle -> Doc AnsiStyle
annGreen forall a b. (a -> b) -> a -> b
$ Doc AnsiStyle
dui forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc AnsiStyle
msg forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
line