module Yi.Option
(
YiOption
, YiOptionDescr
, YiOptions
, OptionError(..)
, yiCustomOptions
, consYiOption
, consYiOptions
, yiBoolOption
, yiFlagOption
, yiActionFlagOption
, yiStringOption
, yiStringOption'
, yiActionOption
, yiActionOption'
)
where
import Data.Default (Default)
import qualified Data.Text as T (Text)
import Data.Typeable (Typeable)
import Data.String (IsString, fromString)
import Lens.Micro.Platform (Lens', makeLenses, over, set)
import System.Exit (ExitCode)
import System.Console.GetOpt (OptDescr, ArgDescr(..))
import Yi.Config.Lens (configVariable, startActionsA)
import Yi.Types (Action, Config, YiConfigVariable)
data OptionError = OptionError T.Text ExitCode
type YiOption = Config -> Either OptionError Config
type YiOptionDescr = OptDescr YiOption
newtype YiOptions = YiOptions { _yiOptions :: [YiOptionDescr] }
deriving (Default, Typeable)
instance YiConfigVariable YiOptions
makeLenses ''YiOptions
yiCustomOptions :: Lens' Config [YiOptionDescr]
yiCustomOptions = configVariable . yiOptions
consYiOption :: YiOptionDescr -> Config -> Config
consYiOption opt = over yiCustomOptions (opt:)
consYiOptions :: [YiOptionDescr] -> Config -> Config
consYiOptions opts = over yiCustomOptions (opts++)
yiBoolOption :: Lens' Config Bool -> ArgDescr YiOption
yiBoolOption lens = NoArg $ Right . set lens True
yiFlagOption :: Lens' Config a -> (a -> a) -> ArgDescr YiOption
yiFlagOption lens f = NoArg $ Right . over lens f
yiActionFlagOption :: Action -> ArgDescr YiOption
yiActionFlagOption action = NoArg f
where f config = Right $ over startActionsA (++[action]) config
yiStringOption :: IsString a => Lens' Config a -> String -> ArgDescr YiOption
yiStringOption lens desc = ReqArg f desc
where f string config = Right $ set lens (fromString string) config
yiStringOption' :: IsString a => Lens' Config (Maybe a) -> String -> ArgDescr YiOption
yiStringOption' lens desc = ReqArg f desc
where f string config = Right $ set lens (Just $ fromString string) config
yiActionOption :: IsString a => (a -> Action) -> String -> ArgDescr YiOption
yiActionOption action desc = ReqArg f desc
where f string config = Right $ over startActionsA (++[action (fromString string)]) config
yiActionOption' :: IsString a => (a -> Either OptionError Action) -> String -> ArgDescr YiOption
yiActionOption' action desc = ReqArg f desc
where f string config = do
action' <- action (fromString string)
return $ over startActionsA (++[action']) config