tricorder-1.0.0.0: src/Tricorder/Daemon/Ghci/Config/File.hs
module Tricorder.Daemon.Ghci.Config.File
( File (..)
, toConfig
)
where
import Atelier.Time (AsRawUnit (..), Millisecond)
import Atelier.Types.JSON.QuietSnake (QuietSnake (..))
import Atelier.Types.JSON.WithDefaults (WithDefaults (..))
import Data.Aeson (FromJSON, ToJSON)
import Data.Default (Default (..))
import Atelier.Time qualified as Time
import Tricorder.Daemon.Ghci.Config (Config (..))
data File = File
{ startupTimeoutMs :: Maybe (AsRawUnit Millisecond)
-- ^ How long to wait for the GHCi version banner on startup.
, shutdownTimeoutMs :: Maybe (AsRawUnit Millisecond)
-- ^ How long to wait for the process to exit gracefully before force-killing.
, extraSetupCommands :: Maybe [Text]
-- ^ Additional GHCi commands to send after the fixed setup block.
-- Use this to inject session-wide options such as @:set -XOverloadedStrings@.
}
deriving stock (Eq, Generic, Show)
deriving (ToJSON) via QuietSnake File
deriving (FromJSON) via WithDefaults (QuietSnake File)
instance Default File where
def = File Nothing Nothing Nothing
toConfig :: File -> Config
toConfig file =
Config
{ startupTimeout = maybe cfg.startupTimeout (Time.convertUnit . getAsRawUnit) file.startupTimeoutMs
, shutdownTimeout = maybe cfg.shutdownTimeout (Time.convertUnit . getAsRawUnit) file.shutdownTimeoutMs
, extraSetupCommands = fromMaybe cfg.extraSetupCommands file.extraSetupCommands
}
where
cfg = def :: Config