packages feed

imp-1.0.2.0: source/library/Imp/Type/Config.hs

module Imp.Type.Config where

import qualified Control.Monad as Monad
import qualified Control.Monad.Catch as Exception
import qualified Imp.Type.Alias as Alias
import qualified Imp.Type.Flag as Flag
import qualified Imp.Type.Package as Package

data Config = Config
  { aliases :: [Alias.Alias],
    help :: Bool,
    packages :: [Package.Package],
    version :: Bool
  }
  deriving (Eq, Show)

initial :: Config
initial =
  Config
    { aliases = [],
      help = False,
      packages = [],
      version = False
    }

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

applyFlag :: (Exception.MonadThrow m) => Config -> Flag.Flag -> m Config
applyFlag config flag = case flag of
  Flag.Alias string -> do
    alias <- Alias.fromString string
    pure config {aliases = alias : aliases config}
  Flag.Help bool -> pure config {help = bool}
  Flag.Package string -> do
    package <- Package.fromString string
    pure config {packages = package : packages config}
  Flag.Version bool -> pure config {version = bool}