{-# LANGUAGE CPP #-}

-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.Monitors.ArchUpdates
-- Copyright   :  (c) 2024 Enrico Maria De Angelis
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Enrico Maria De Angelis <enricomaria.dean6elis@gmail.com>
-- Stability   :  unstable
-- Portability :  unportable
--
-- An ArchLinux updates availablility plugin for Xmobar
--
-----------------------------------------------------------------------------

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--ero updates
        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"