{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Main where
import Common
import Data.Text (pack)
import Turtle
import Data.Maybe (fromMaybe)
import System.Environment (getArgs)
newtype BatteryPercentage = BatteryPercentage Integer
data BatteryStatus = Discharging | Charging | Full | Plugged | Unknown
data MemType = MemTotal | MemFree
main :: IO ()
main = sh $ do
acpi <- acpi'
icons <- liftIO getArgs
let info = parse acpi
maybe (renderNoBattery icons) (renderOutput icons) info
where
renderNoBattery icons =
let desc = fromMaybe "No Battery" $ getNoBatteryIcon icons
in blockOutput $ OutputReport (LongDesc desc) Nothing Nothing
renderOutput icons info
= blockOutput $ OutputReport (makeLongDesc info) Nothing (makeColor $ fst info)
where
makeLongDesc = LongDesc . formatBattery icons
makeColor (BatteryPercentage per) = Color <$> batteryColor per
formatBattery :: [String] -> (BatteryPercentage, BatteryStatus) -> Text
formatBattery icons info = case info of
(BatteryPercentage per, Discharging) -> format' (getIcon icons per) per
(BatteryPercentage per, Unknown) -> format' (getIcon icons per) per
(BatteryPercentage per, _) -> format' (fromMaybe "" $ getFullBatteryIcon icons) per
format' :: Show a => Text -> a -> Text
format' icon per = icon <> (pack $ show per) <> "%"
getIcon :: [String] -> Integer -> Text
getIcon icons p | p >= 90 = fromMaybe "" $ getHighBatteryIcon icons
getIcon icons p | p >= 75 = fromMaybe "" $ getMediumBatteryIcon icons
getIcon icons p | p >= 25 = fromMaybe "" $ getLowBatteryIcon icons
getIcon icons _ = fromMaybe "" $ getEmptyBatteryIcon icons
getNoBatteryIcon :: [String] -> Maybe Text
getNoBatteryIcon icons = case icons of
icon : _ -> Just $ pack icon
_ -> Nothing
getEmptyBatteryIcon :: [String] -> Maybe Text
getEmptyBatteryIcon icons = case icons of
_ : icon : _ -> Just $ pack icon
_ -> Nothing
getLowBatteryIcon :: [String] -> Maybe Text
getLowBatteryIcon icons = case icons of
_ : _ : icon : _ -> Just $ pack icon
_ -> Nothing
getMediumBatteryIcon :: [String] -> Maybe Text
getMediumBatteryIcon icons = case icons of
_ : _ : _ : icon : _ -> Just $ pack icon
_ -> Nothing
getHighBatteryIcon :: [String] -> Maybe Text
getHighBatteryIcon icons = case icons of
_ : _ : _ : _ : icon : _ -> Just $ pack icon
_ -> Nothing
getFullBatteryIcon :: [String] -> Maybe Text
getFullBatteryIcon icons = case icons of
_ : _ : _ : _ : _ : icon : _ -> Just $ pack icon
_ -> Nothing
batteryColor :: Integer -> Maybe Text
batteryColor p | p <= 25 = Just "#ff0000"
batteryColor _ = Nothing
parse :: Text -> Maybe (BatteryPercentage, BatteryStatus)
parse acpi = case match batteryLeft acpi of
[] -> Nothing
info:_ -> Just info
batteryLeft :: Pattern (BatteryPercentage, BatteryStatus)
batteryLeft = do
_ <- batteryNumber
state <- spaces1 *> chars1 <* ","
per <- spaces1 *> decimal <* "%" <* ("," <|> "") <* spaces1 <* star anyChar
return (BatteryPercentage per, toBatteryStatus state)
where
batteryNumber = "Battery" *> spaces1 *> decimal @Integer *> ":"
toBatteryStatus "Discharging" = Discharging
toBatteryStatus "Charging" = Charging
toBatteryStatus "Plugged" = Plugged
toBatteryStatus "Full" = Full
toBatteryStatus _ = Unknown
acpi' :: Shell Text
acpi' = strict $ inshell (pack "acpi") empty