packages feed

tricorder-1.0.0.0: src/Tricorder/Session/Config.hs

module Tricorder.Session.Config (Config (..)) where

import Atelier.Types.JSON.QuietSnake (QuietSnake (..))
import Atelier.Types.JSON.Renamed (Renamed)
import Atelier.Types.JSON.WithDefaults (WithDefaults (..))
import Data.Aeson (FromJSON (..), ToJSON)
import Data.Default (Default (..))

import Tricorder.Session.CommandConfig (CommandConfig)
import Tricorder.Session.Hooks (Hooks)
import Tricorder.Session.Stage.Test.Config (TestConfig)

import Tricorder.Session.Stage qualified as Stage


data Config = Config
    { build :: CommandConfig 'Stage.Build
    , test :: TestConfig
    , eval :: CommandConfig 'Stage.Eval
    , watchDirs :: [FilePath]
    , watchExclusionPatterns :: [Text]
    , replBuildDir :: FilePath
    , testTimeout :: Maybe (Renamed "test_timeout" "test.timeout_ms")
    , testMemoryLimit :: Maybe (Renamed "test_memory_limit" "test.memory_limit")
    , generateWithHpack :: Bool
    , hooks :: Maybe Hooks
    , idleTimeoutSeconds :: Int
    , command :: Maybe (Renamed "command" "build.command_template")
    , targets :: Maybe (Renamed "targets" "build.targets")
    , testTargets :: Maybe (Renamed "test_targets" "test.targets")
    }
    deriving stock (Eq, Generic, Show)
    deriving (ToJSON) via QuietSnake Config
    deriving (FromJSON) via WithDefaults (QuietSnake Config)


instance Default Config where
    def =
        Config
            { build = def
            , test = def
            , eval = def
            , watchDirs = []
            , watchExclusionPatterns = []
            , replBuildDir = "dist-newstyle/tricorder"
            , testTimeout = Nothing
            , testMemoryLimit = Nothing
            , generateWithHpack = True
            , hooks = Nothing
            , idleTimeoutSeconds = 300
            , command = Nothing
            , targets = Nothing
            , testTargets = Nothing
            }