packages feed

rattletrap-14.1.4: src/lib/Rattletrap/Console/Config.hs

module Rattletrap.Console.Config where

import qualified Rattletrap.Console.Flag as Flag
import qualified Rattletrap.Console.Mode as Mode
import qualified System.FilePath as FilePath

data Config = Config
  { compact :: Bool,
    fast :: Bool,
    help :: Bool,
    input :: Maybe String,
    mode :: Maybe Mode.Mode,
    output :: Maybe String,
    schema :: Bool,
    skipCrc :: Bool,
    version :: Bool
  }
  deriving (Eq, Show)

initial :: Config
initial =
  Config
    { compact = False,
      fast = False,
      help = False,
      input = Nothing,
      mode = Nothing,
      output = Nothing,
      schema = False,
      skipCrc = False,
      version = False
    }

applyFlag :: Config -> Flag.Flag -> Either String Config
applyFlag config flag = case flag of
  Flag.Compact -> Right config {compact = True}
  Flag.Fast -> Right config {fast = True}
  Flag.Help -> Right config {help = True}
  Flag.Input x -> Right config {input = Just x}
  Flag.Mode x -> do
    y <- Mode.fromString x
    Right config {mode = Just y}
  Flag.Output x -> Right config {output = Just x}
  Flag.Schema -> Right config {schema = True}
  Flag.SkipCrc -> Right config {skipCrc = True}
  Flag.Version -> Right config {version = True}

getMode :: Config -> Mode.Mode
getMode config =
  let i = fmap FilePath.takeExtension $ input config
      o = fmap FilePath.takeExtension $ output config
   in case (i, o) of
        (Just ".json", _) -> Mode.Encode
        (Just ".replay", _) -> Mode.Decode
        (_, Just ".json") -> Mode.Decode
        (_, Just ".replay") -> Mode.Encode
        _ -> Mode.Decode