{-|
Module      : Args
Description : CLI arguments record
Copyright   : (c) 2017 Patrick Champion
License     : see LICENSE file
Maintainer  : chlablak@gmail.com
Stability   : provisional
Portability : portable
-}

module Args
    ( Args(..)
    , CommonArgs(..)
    , CommandArgs(..)
    , EbnfArgs(..)
    , LalrArgs(..)
    , NewArgs(..)
    , BuildArgs(..)
    ) where

-- |Global arguments
data Args = Args CommonArgs CommandArgs
  deriving Show

-- |Common arguments
data CommonArgs = CommonArgs
  { setLevel :: Int     -- ^Verbosity level
  , silent   :: Bool    -- ^Verbosity off
  , useWork  :: Bool    -- ^Use '.pp-work/' directory
  , path     :: String  -- ^Working directory path
  }
    deriving Show

-- |Allowed commands
data CommandArgs
  = EbnfCmd EbnfArgs    -- ^EBNF command
  | LalrCmd LalrArgs    -- ^LALR command
  | NewCmd NewArgs      -- ^New command
  | BuildCmd BuildArgs  -- ^Build command
    deriving Show

-- |EBNF command arguments
data EbnfArgs = EbnfArgs
  { ebnfFile      :: String   -- ^Input file
  , showMinified  :: Bool     -- ^Print the minified grammar to output
  , showRules     :: Bool     -- ^Print the obtained rules
  , showFirstSet  :: Bool     -- ^Print the first set
  , doCheck       :: Bool     -- ^Search for errors in grammar
  , showLexical   :: Bool     -- ^Print lexical rules
  , showRegexfied :: Bool     -- ^Print the regexfied lexical rules
  }
    deriving Show

-- |LALR command arguments
data LalrArgs = LalrArgs
  { lalrFile       :: String  -- ^Input file
  , showCollection :: Bool    -- ^Print the items sets collection
  , showSetI       :: Int     -- ^Print a specific items set
  , showTable      :: Bool    -- ^Print the LALR table
  , testWith       :: String  -- ^Test the LALR table on a source file
  , template       :: String  -- ^Specify a template
  , showDfa        :: Bool    -- ^Print the DFA
  , showAst        :: Bool    -- ^Print the parsed AST
  , astHtml        :: String  -- ^Output the AST to HTML list
  }
    deriving Show

-- |New command arguments
newtype NewArgs = NewArgs
  { projectName :: String   -- ^Project name
  }
    deriving (Show)

-- |Build command arguments
data BuildArgs = BuildArgs
  { disableTemplate :: Bool   -- ^Disable template compilation
  , disableTest     :: Bool   -- ^Disable tests
  , buildTestWith   :: String -- ^Test the LALR table on a source file
  , buildShowAst    :: Bool   -- ^Print the parsed AST
  , buildAstHtml    :: String -- ^Output the AST to HTML list
  }
    deriving (Show)