{-|
Module : Main
Description : Command Line Interface for Platinum Parsing
Copyright : (c) 2017 Patrick Champion
License : see LICENSE file
Maintainer : chlablak@gmail.com
Stability : provisional
Portability : portable
This module is the entry point for the pp-cli tool.
For more informations about this tool, please look at:
https://github.com/chlablak/platinum-parsing
-}
module Main where
import Args
import qualified Cmd.Build
import qualified Cmd.Ebnf
import qualified Cmd.Lalr
import qualified Cmd.New
import Control.Monad (void)
import Control.Monad.State
import Data.Semigroup ((<>))
import qualified Log
import Options.Applicative
import qualified Work
main :: IO ()
main = do
args <- execParser opts
void $ execStateT (dispatch args) Log.getLog
where
opts = info (args <**> helper)
( fullDesc
<> progDesc "Platinum Parsing CLI"
<> header "tools for helping PP projects" )
-- |Dispatch arguments to commands
dispatch :: Args -> Log.Logger
dispatch args@(Args cargs _) = do
Log.start (if silent cargs then 1000000 else setLevel cargs) "pp"
Log.autoFlush True
Log.info "starting..."
Log.info $ "verbosity: " ++
(if setLevel cargs == 0 then "all" else show (setLevel cargs))
Work.path $ path cargs
when (useWork cargs) Work.initialize
dispatch' args
Log.info "bye."
where
dispatch' :: Args -> Log.Logger
dispatch' a@(Args _ (EbnfCmd _)) = Cmd.Ebnf.dispatch a
dispatch' a@(Args _ (LalrCmd _)) = Cmd.Lalr.dispatch a
dispatch' a@(Args _ (NewCmd _)) = Cmd.New.dispatch a
dispatch' a@(Args _ (BuildCmd _)) = Cmd.Build.dispatch a
-- |Arguments
args :: Parser Args
args = Args <$> commonArgs <*> commandArgs
-- |Common arguments
commonArgs :: Parser CommonArgs
commonArgs = CommonArgs
<$> option auto ( long "verbosity"
<> short 'v'
<> metavar "LEVEL"
<> value 30
<> help "Set verbosity level" )
<*> switch ( long "silent"
<> short 's'
<> help "Verbosity off" )
<*> switch ( long "work"
<> short 'w'
<> help "Use '.pp-work/' directory" )
<*> strOption ( long "path"
<> metavar "PATH"
<> value "."
<> help "Change working directory path" )
-- |Commands arguments
commandArgs :: Parser CommandArgs
commandArgs = hsubparser
( command "ebnf" (info Cmd.Ebnf.commandArgs (progDesc "Manipulate EBNF grammars"))
<> command "lalr" (info Cmd.Lalr.commandArgs (progDesc "Generate LALR parsing table"))
<> command "new" (info Cmd.New.commandArgs (progDesc "Create a new PP project"))
<> command "build" (info Cmd.Build.commandArgs (progDesc "Build a PP project")))