{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}

-- | This module provides toml configuration for the battery status service.
module Navi.Services.Battery.Status.Toml
  ( BatteryStatusToml (..),
  )
where

import Navi.Data.NaviNote (Timeout, timeoutOptDecoder)
import Navi.Data.PollInterval (PollInterval (..), pollIntervalOptDecoder)
import Navi.Event.Toml
  ( ErrorNoteToml,
    RepeatEventToml,
    errorNoteOptDecoder,
    repeatEventOptDecoder,
  )
import Navi.Prelude
import Navi.Services.Battery.Common (batteryAppDecoder)
import Pythia.Services.Battery (BatteryApp)

-- | TOML for the battery status service.
data BatteryStatusToml = MkBatteryStatusToml
  { -- | Determines how we should query the system for battery information.
    BatteryStatusToml -> BatteryApp
app :: BatteryApp,
    -- | The poll interval.
    BatteryStatusToml -> Maybe PollInterval
pollInterval :: Maybe PollInterval,
    -- | Determines how we treat repeat alerts.
    BatteryStatusToml -> Maybe RepeatEventToml
repeatEvent :: Maybe RepeatEventToml,
    -- | Determines how we handle errors.
    BatteryStatusToml -> Maybe ErrorNoteToml
errorNote :: Maybe ErrorNoteToml,
    -- | The timeout for this alert.
    BatteryStatusToml -> Maybe Timeout
mTimeout :: Maybe Timeout
  }
  deriving stock (BatteryStatusToml -> BatteryStatusToml -> Bool
(BatteryStatusToml -> BatteryStatusToml -> Bool)
-> (BatteryStatusToml -> BatteryStatusToml -> Bool)
-> Eq BatteryStatusToml
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BatteryStatusToml -> BatteryStatusToml -> Bool
== :: BatteryStatusToml -> BatteryStatusToml -> Bool
$c/= :: BatteryStatusToml -> BatteryStatusToml -> Bool
/= :: BatteryStatusToml -> BatteryStatusToml -> Bool
Eq, Int -> BatteryStatusToml -> ShowS
[BatteryStatusToml] -> ShowS
BatteryStatusToml -> String
(Int -> BatteryStatusToml -> ShowS)
-> (BatteryStatusToml -> String)
-> ([BatteryStatusToml] -> ShowS)
-> Show BatteryStatusToml
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BatteryStatusToml -> ShowS
showsPrec :: Int -> BatteryStatusToml -> ShowS
$cshow :: BatteryStatusToml -> String
show :: BatteryStatusToml -> String
$cshowList :: [BatteryStatusToml] -> ShowS
showList :: [BatteryStatusToml] -> ShowS
Show)

makeFieldLabelsNoPrefix ''BatteryStatusToml

-- | @since 0.1
instance DecodeTOML BatteryStatusToml where
  tomlDecoder :: Decoder BatteryStatusToml
tomlDecoder =
    BatteryApp
-> Maybe PollInterval
-> Maybe RepeatEventToml
-> Maybe ErrorNoteToml
-> Maybe Timeout
-> BatteryStatusToml
MkBatteryStatusToml
      (BatteryApp
 -> Maybe PollInterval
 -> Maybe RepeatEventToml
 -> Maybe ErrorNoteToml
 -> Maybe Timeout
 -> BatteryStatusToml)
-> Decoder BatteryApp
-> Decoder
     (Maybe PollInterval
      -> Maybe RepeatEventToml
      -> Maybe ErrorNoteToml
      -> Maybe Timeout
      -> BatteryStatusToml)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder BatteryApp -> Text -> Decoder BatteryApp
forall a. Decoder a -> Text -> Decoder a
getFieldWith Decoder BatteryApp
batteryAppDecoder Text
"app"
      Decoder
  (Maybe PollInterval
   -> Maybe RepeatEventToml
   -> Maybe ErrorNoteToml
   -> Maybe Timeout
   -> BatteryStatusToml)
-> Decoder (Maybe PollInterval)
-> Decoder
     (Maybe RepeatEventToml
      -> Maybe ErrorNoteToml -> Maybe Timeout -> BatteryStatusToml)
forall a b. Decoder (a -> b) -> Decoder a -> Decoder b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Decoder (Maybe PollInterval)
pollIntervalOptDecoder
      Decoder
  (Maybe RepeatEventToml
   -> Maybe ErrorNoteToml -> Maybe Timeout -> BatteryStatusToml)
-> Decoder (Maybe RepeatEventToml)
-> Decoder
     (Maybe ErrorNoteToml -> Maybe Timeout -> BatteryStatusToml)
forall a b. Decoder (a -> b) -> Decoder a -> Decoder b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Decoder (Maybe RepeatEventToml)
repeatEventOptDecoder
      Decoder (Maybe ErrorNoteToml -> Maybe Timeout -> BatteryStatusToml)
-> Decoder (Maybe ErrorNoteToml)
-> Decoder (Maybe Timeout -> BatteryStatusToml)
forall a b. Decoder (a -> b) -> Decoder a -> Decoder b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Decoder (Maybe ErrorNoteToml)
errorNoteOptDecoder
      Decoder (Maybe Timeout -> BatteryStatusToml)
-> Decoder (Maybe Timeout) -> Decoder BatteryStatusToml
forall a b. Decoder (a -> b) -> Decoder a -> Decoder b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Decoder (Maybe Timeout)
timeoutOptDecoder