systranything-0.1.3.0: lib/Model/Command.hs
{-# LANGUAGE TemplateHaskell #-}
module Model.Command (Command (..), periodicallyUpdateIcon) where
import Control.Monad (void)
import Data.Aeson.TH (deriveJSON)
import Data.List.NonEmpty (NonEmpty (..))
import Data.List.NonEmpty.Extra ((!?))
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Data.Text qualified as T
import Data.Word (Word32)
import GHC.Generics (Generic)
import GI.AyatanaAppIndicator3 qualified as AI
import GI.GLib qualified as GLib
import Model.Common (runCommand)
import Model.Internal (options)
import Text.Read (readMaybe)
data Command = MkCommand
{ coOnTimeout :: Text,
coPollingInterval :: Word32,
coIcons :: [Text]
}
deriving stock (Eq, Generic, Show)
$(deriveJSON options ''Command)
periodicallyUpdateIcon :: Bool -> AI.Indicator -> Text -> Command -> IO ()
periodicallyUpdateIcon verbose indicator icon MkCommand {..} =
void . GLib.timeoutAddSeconds GLib.PRIORITY_DEFAULT coPollingInterval $ do
mbOutput <- runCommand verbose coOnTimeout
let newIcon = fromMaybe icon $ fromIndex =<< toInt =<< mbOutput
AI.indicatorSetIconFull indicator newIcon Nothing
pure True
where
fromIndex = (!?) (icon :| coIcons)
toInt = readMaybe . T.unpack