packages feed

stackctl-1.2.0.0: src/Stackctl/Options.hs

module Stackctl.Options
  ( Options
  , envParser
  , optionsParser
  ) where

import Stackctl.Prelude

import Data.Semigroup.Generic
import qualified Env
import Options.Applicative
import Stackctl.ColorOption
import Stackctl.DirectoryOption
import Stackctl.FilterOption
import Stackctl.VerboseOption

data Options = Options
  { oDirectory :: Maybe DirectoryOption
  , oFilter :: Maybe FilterOption
  , oColor :: Maybe ColorOption
  , oVerbose :: Verbosity
  }
  deriving stock Generic
  deriving Semigroup via GenericSemigroupMonoid Options

directoryL :: Lens' Options (Maybe DirectoryOption)
directoryL = lens oDirectory $ \x y -> x { oDirectory = y }

filterL :: Lens' Options (Maybe FilterOption)
filterL = lens oFilter $ \x y -> x { oFilter = y }

colorL :: Lens' Options (Maybe ColorOption)
colorL = lens oColor $ \x y -> x { oColor = y }

instance HasDirectoryOption Options where
  directoryOptionL = directoryL . maybeLens defaultDirectoryOption

instance HasFilterOption Options where
  filterOptionL = filterL . maybeLens defaultFilterOption

instance HasColorOption Options where
  colorOptionL = colorL . maybeLens defaultColorOption

instance HasVerboseOption Options where
  verboseOptionL = lens oVerbose $ \x y -> x { oVerbose = y }

-- brittany-disable-next-binding

envParser :: Env.Parser Env.Error Options
envParser = Env.prefixed "STACKCTL_" $ Options
  <$> optional envDirectoryOption
  <*> optional (envFilterOption "specifications")
  <*> pure mempty -- use LOG_COLOR
  <*> pure mempty -- use LOG_LEVEL

-- brittany-disable-next-binding

optionsParser :: Parser Options
optionsParser = Options
  <$> optional directoryOption
  <*> optional (filterOption "specifications")
  <*> (Just <$> colorOption)
  <*> verboseOption