packages feed

cabal-gild-0.3.0.0: source/library/CabalGild/Type/Config.hs

module CabalGild.Type.Config where

import qualified CabalGild.Type.Flag as Flag
import qualified CabalGild.Type.Mode as Mode
import qualified Control.Monad as Monad
import qualified Control.Monad.Catch as Exception

data Config = Config
  { help :: Bool,
    input :: Maybe FilePath,
    mode :: Mode.Mode,
    output :: Maybe FilePath,
    stdin :: FilePath,
    version :: Bool
  }
  deriving (Eq, Show)

initial :: Config
initial =
  Config
    { help = False,
      input = Nothing,
      mode = Mode.Format,
      output = Nothing,
      stdin = ".",
      version = False
    }

applyFlag :: (Exception.MonadThrow m) => Config -> Flag.Flag -> m Config
applyFlag config flag = case flag of
  Flag.Help b -> pure config {help = b}
  Flag.Input s -> case s of
    "-" -> pure config {input = Nothing}
    _ -> pure config {input = Just s}
  Flag.Mode s -> do
    m <- Mode.fromString s
    pure config {mode = m}
  Flag.Output s -> case s of
    "-" -> pure config {output = Nothing}
    _ -> pure config {output = Just s}
  Flag.Stdin s -> pure config {stdin = s}
  Flag.Version b -> pure config {version = b}

fromFlags :: (Exception.MonadThrow m) => [Flag.Flag] -> m Config
fromFlags = Monad.foldM applyFlag initial