packages feed

rattletrap-10.0.0: 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 = FilePath.takeExtension <$> input config
    o = 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