packages feed

elynx-0.2.1: app/Options.hs

{-# LANGUAGE DeriveGeneric       #-}

{- |
Module      :  Options
Description :  Options for elynx validation and redo sub commands
Copyright   :  (c) Dominik Schrempf 2020
License     :  GPL-3.0-or-later

Maintainer  :  dominik.schrempf@gmail.com
Stability   :  unstable
Portability :  portable

Creation date: Thu Apr 23 19:17:17 2020.

-}

module Options
  ( AllReproductions(..)
  , getProgName
  , getArgs
  , ValidateArguments(..)
  , RedoArguments(..)
  , CommandArguments(..)
  , commandArguments
  )
where

import           Options.Applicative

import           ELynx.Tools

import qualified SLynx.Options                 as S
import qualified TLynx.Options                 as T

-- | Collect all reproductions in one data type.
data AllReproductions = S (Reproduction (Arguments S.CommandArguments))
                      | T (Reproduction (Arguments T.CommandArguments))

-- | Get program name irrespective of which program has been run.
getProgName :: AllReproductions -> String
getProgName (S x) = progName x
getProgName (T x) = progName x

-- | Get arguments irrespective of which program has been run.
getArgs :: AllReproductions -> [String]
getArgs (S x) = argsStr x
getArgs (T x) = argsStr x

newtype ValidateArguments = ValidateArguments
  { vElynxFile :: FilePath }
  deriving (Eq, Show, Generic)

validateArguments :: Parser ValidateArguments
validateArguments = ValidateArguments <$> inFileArg

validateDsc :: [String]
validateDsc = ["Validate an ELynx analysis"]

data RedoArguments = RedoArguments
  { rElynxFile :: FilePath
  , rForce :: Force }
  deriving (Eq, Show, Generic)

redoArguments :: Parser RedoArguments
redoArguments = RedoArguments <$> inFileArg <*> forceOpt

redoDsc :: [String]
redoDsc = ["Redo an ELynx analysis"]

inFileArg :: Parser FilePath
inFileArg = strArgument $ metavar "ELYNX-FILE"

data CommandArguments = Validate ValidateArguments
                      | Redo RedoArguments

validateCommand :: Mod CommandFields CommandArguments
validateCommand =
  createCommand "validate" validateDsc [] validateArguments Validate

redoCommand :: Mod CommandFields CommandArguments
redoCommand = createCommand "redo" redoDsc [] redoArguments Redo

commandArguments :: ParserInfo CommandArguments
commandArguments =
  elynxParserInfo desc [] $ hsubparser $ validateCommand <> redoCommand

desc :: [String]
desc = ["Validate and redo past ELynx analyses"]