{-# LANGUAGE OverloadedStrings #-}

module Package.C.Error ( printErr
                       , unrecognized
                       , indexError
                       , corruptedDatabase
                       , unfoundPackage
                       , parseErr
                       , notInstalled
                       , PackageError (..)
                       ) where

import           CPkgPrelude
import           Data.Text.Prettyprint.Doc.Custom
import           Prettyprinter
import           Prettyprinter.Render.Text
import           System.Exit

data PackageError = Unrecognized String
                  | IndexError String -- package name
                  | CorruptedDatabase
                  | UnfoundPackage -- TODO: this should take the package name as an argument
                  | NotInstalled String
                  | ParseFailed String
                  -- TODO: libarchive error

instance Pretty PackageError where
    pretty :: forall ann. PackageError -> Doc ann
pretty (Unrecognized String
t)   = Doc ann
"Error: Unrecognized archive format when unpacking" Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
hang Int
2 (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
t) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline
    pretty (IndexError String
str)   = Doc ann
"Error: Package" Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
str Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> Doc ann
"not found in your indices. Try 'cpkg install" Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
str Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"'." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline
    pretty PackageError
CorruptedDatabase  = Doc ann
"Error: Package database corrupted. Please try 'cpkg nuke'" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline
    pretty PackageError
UnfoundPackage     = Doc ann
"Error: Package not found" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline
    pretty (ParseFailed String
str)  = Doc ann
"Parse error:" Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
str
    pretty (NotInstalled String
pkg) = Doc ann
"Package" Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
pkg Doc ann -> Doc ann -> Doc ann
forall a. Doc a -> Doc a -> Doc a
<+> Doc ann
"is not installed, so not removed." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
hardline

printErr :: MonadIO m => PackageError -> m a
printErr :: forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr PackageError
e = IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Doc Any -> IO ()
forall ann. Doc ann -> IO ()
putDoc (PackageError -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. PackageError -> Doc ann
pretty PackageError
e) IO () -> IO a -> IO a
forall a b. IO a -> IO b -> IO b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> IO a
forall a. IO a
exitFailure)

notInstalled :: MonadIO m => String -> m a
notInstalled :: forall (m :: * -> *) a. MonadIO m => String -> m a
notInstalled = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr (PackageError -> m a) -> (String -> PackageError) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageError
NotInstalled

unrecognized :: MonadIO m => String -> m a
unrecognized :: forall (m :: * -> *) a. MonadIO m => String -> m a
unrecognized = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr (PackageError -> m a) -> (String -> PackageError) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageError
Unrecognized

indexError :: MonadIO m => String -> m a
indexError :: forall (m :: * -> *) a. MonadIO m => String -> m a
indexError = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr (PackageError -> m a) -> (String -> PackageError) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageError
IndexError

corruptedDatabase :: MonadIO m => m a
corruptedDatabase :: forall (m :: * -> *) a. MonadIO m => m a
corruptedDatabase = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr PackageError
CorruptedDatabase

unfoundPackage :: MonadIO m => m a
unfoundPackage :: forall (m :: * -> *) a. MonadIO m => m a
unfoundPackage = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr PackageError
UnfoundPackage

parseErr :: MonadIO m => String -> m a
parseErr :: forall (m :: * -> *) a. MonadIO m => String -> m a
parseErr = PackageError -> m a
forall (m :: * -> *) a. MonadIO m => PackageError -> m a
printErr (PackageError -> m a) -> (String -> PackageError) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PackageError
ParseFailed