{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
module Aura.Settings
( Settings(..)
, logFuncOfL
, BuildConfig(..), BuildSwitch(..)
, buildPathOfL, buildUserOfL, buildSwitchesOfL, allsourcePathOfL, vcsPathOfL
, switch
, Truncation(..)
, defaultBuildDir
, CommonConfig(..), CommonSwitch(..)
, cachePathOfL, logPathOfL
, ColourMode(..)
, shared
, Makepkg(..)
) where
import Aura.Types
import Network.HTTP.Client (Manager)
import RIO
import qualified RIO.Set as S
import qualified RIO.Text as T
data Truncation = None | Head Word | Tail Word deriving (Eq, Show)
data Makepkg = IgnoreArch | AllSource | SkipInteg deriving (Eq, Ord, Show)
instance Flagable Makepkg where
asFlag IgnoreArch = ["--ignorearch"]
asFlag AllSource = ["--allsource"]
asFlag SkipInteg = ["--skipinteg"]
data CommonConfig = CommonConfig
{ cachePathOf :: !(Either FilePath FilePath)
, configPathOf :: !(Either FilePath FilePath)
, logPathOf :: !(Either FilePath FilePath)
, commonSwitchesOf :: !(Set CommonSwitch) } deriving (Show, Generic)
cachePathOfL :: Lens' CommonConfig (Either FilePath FilePath)
cachePathOfL f cc = (\cp -> cc { cachePathOf = cp }) <$> f (cachePathOf cc)
logPathOfL :: Lens' CommonConfig (Either FilePath FilePath)
logPathOfL f cc = (\cp -> cc { logPathOf = cp }) <$> f (logPathOf cc)
instance Flagable CommonConfig where
asFlag (CommonConfig cap cop lfp cs) =
either (const []) (\p -> ["--cachedir", T.pack p]) cap
<> either (const []) (\p -> ["--config", T.pack p]) cop
<> either (const []) (\p -> ["--logfile", T.pack p]) lfp
<> asFlag cs
data CommonSwitch = NoConfirm | NeededOnly | Debug | Colour ColourMode | Overwrite Text
deriving (Eq, Ord, Show)
instance Flagable CommonSwitch where
asFlag NoConfirm = ["--noconfirm"]
asFlag NeededOnly = ["--needed"]
asFlag Debug = ["--debug"]
asFlag (Colour m) = "--color" : asFlag m
asFlag (Overwrite t) = "--overwrite" : asFlag t
data ColourMode = Never | Always | Auto deriving (Eq, Ord, Show)
instance Flagable ColourMode where
asFlag Never = ["never"]
asFlag Always = ["always"]
asFlag Auto = ["auto"]
data BuildConfig = BuildConfig
{ makepkgFlagsOf :: !(Set Makepkg)
, buildPathOf :: !(Maybe FilePath)
, buildUserOf :: !(Maybe User)
, allsourcePathOf :: !(Maybe FilePath)
, vcsPathOf :: !(Maybe FilePath)
, truncationOf :: !Truncation
, buildSwitchesOf :: !(Set BuildSwitch) } deriving (Show)
buildPathOfL :: Lens' BuildConfig (Maybe FilePath)
buildPathOfL f bc = (\bp -> bc { buildPathOf = bp }) <$> f (buildPathOf bc)
buildUserOfL :: Lens' BuildConfig (Maybe User)
buildUserOfL f bc = (\bu -> bc { buildUserOf = bu }) <$> f (buildUserOf bc)
buildSwitchesOfL :: Lens' BuildConfig (Set BuildSwitch)
buildSwitchesOfL f bc = (\bs -> bc { buildSwitchesOf = bs }) <$> f (buildSwitchesOf bc)
allsourcePathOfL :: Lens' BuildConfig (Maybe FilePath)
allsourcePathOfL f bc = (\pth -> bc { allsourcePathOf = pth }) <$> f (allsourcePathOf bc)
vcsPathOfL :: Lens' BuildConfig (Maybe FilePath)
vcsPathOfL f bc = (\pth -> bc { vcsPathOf = pth }) <$> f (vcsPathOf bc)
data BuildSwitch = DeleteMakeDeps
| DiffPkgbuilds
| DontSuppressMakepkg
| DryRun
| HotEdit
| LowVerbosity
| RebuildDevel
| SortAlphabetically
| ForceBuilding
| NoPkgbuildCheck
| AsDeps
deriving (Eq, Ord, Show)
switch :: Settings -> BuildSwitch -> Bool
switch ss bs = S.member bs . buildSwitchesOf $ buildConfigOf ss
shared :: Settings -> CommonSwitch -> Bool
shared ss c = S.member c . commonSwitchesOf $ commonConfigOf ss
data Settings = Settings
{ managerOf :: !Manager
, envOf :: !Environment
, langOf :: !Language
, editorOf :: !FilePath
, isTerminal :: !Bool
, ignoresOf :: !(Set PkgName)
, commonConfigOf :: !CommonConfig
, buildConfigOf :: !BuildConfig
, logLevelOf :: !LogLevel
, logFuncOf :: !LogFunc }
deriving stock (Generic)
logFuncOfL :: Lens' Settings LogFunc
logFuncOfL f s = (\lf -> s { logFuncOf = lf }) <$> f (logFuncOf s)
defaultBuildDir :: FilePath
defaultBuildDir = "/tmp"