{-# LANGUAGE CPP #-}
module Xmobar.Plugins.ArchUpdates (ArchUpdates(..)) where
import System.Exit (ExitCode(..))
import System.Process (readProcessWithExitCode)
import Xmobar.Run.Exec
import Xmobar.Plugins.Command (Rate)
data ArchUpdates = ArchUpdates (String, String, String) Rate
deriving (ReadPrec [ArchUpdates]
ReadPrec ArchUpdates
Int -> ReadS ArchUpdates
ReadS [ArchUpdates]
(Int -> ReadS ArchUpdates)
-> ReadS [ArchUpdates]
-> ReadPrec ArchUpdates
-> ReadPrec [ArchUpdates]
-> Read ArchUpdates
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ArchUpdates
readsPrec :: Int -> ReadS ArchUpdates
$creadList :: ReadS [ArchUpdates]
readList :: ReadS [ArchUpdates]
$creadPrec :: ReadPrec ArchUpdates
readPrec :: ReadPrec ArchUpdates
$creadListPrec :: ReadPrec [ArchUpdates]
readListPrec :: ReadPrec [ArchUpdates]
Read, Int -> ArchUpdates -> ShowS
[ArchUpdates] -> ShowS
ArchUpdates -> String
(Int -> ArchUpdates -> ShowS)
-> (ArchUpdates -> String)
-> ([ArchUpdates] -> ShowS)
-> Show ArchUpdates
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ArchUpdates -> ShowS
showsPrec :: Int -> ArchUpdates -> ShowS
$cshow :: ArchUpdates -> String
show :: ArchUpdates -> String
$cshowList :: [ArchUpdates] -> ShowS
showList :: [ArchUpdates] -> ShowS
Show)
instance Exec ArchUpdates where
alias :: ArchUpdates -> String
alias (ArchUpdates (String, String, String)
_ Int
_) = String
"arch"
rate :: ArchUpdates -> Int
rate (ArchUpdates (String, String, String)
_ Int
r) = Int
r
run :: ArchUpdates -> IO String
run (ArchUpdates (String
z, String
o, String
m) Int
_) = do
(exit, stdout, _) <- String -> [String] -> String -> IO (ExitCode, String, String)
readProcessWithExitCode String
"checkupdates" [] String
""
return $ case exit of
ExitFailure Int
2 -> String
z
ExitFailure Int
1 -> String
"pacman: Unknown cause of failure."
ExitCode
ExitSuccess -> case [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ String -> [String]
lines String
stdout of
Int
0 -> String
forall {a}. a
impossible
Int
1 -> String
o
Int
n -> String
m String -> (Char -> String) -> String
forall a b. [a] -> (a -> [b]) -> [b]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Char
c -> if Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'?' then Int -> String
forall a. Show a => a -> String
show Int
n else Char -> String
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure Char
c
ExitCode
_ -> String
forall {a}. a
impossible
where
impossible :: a
impossible = String -> a
forall a. HasCallStack => String -> a
error String
"This is impossible based on pacman manpage"