{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Headroom.Command
( commandParser
)
where
import Headroom.Command.Readers ( licenseReader
, licenseTypeReader
, regexReader
)
import Headroom.Command.Types ( Command(..) )
import Headroom.Configuration.Types ( LicenseType
, RunMode(..)
, TemplateSource(..)
)
import Headroom.Data.EnumExtra ( EnumExtra(..) )
import Headroom.Meta ( productDesc
, productInfo
)
import Options.Applicative
import RIO
import qualified RIO.Text as T
commandParser :: ParserInfo Command
commandParser = info
(commands <**> helper)
(fullDesc <> progDesc (T.unpack productDesc) <> header (T.unpack productInfo))
where
commands = subparser (runCommand <> genCommand <> initCommand)
runCommand = command
"run"
(info (runOptions <**> helper)
(progDesc "add, replace, drop or check source code headers")
)
genCommand = command
"gen"
(info (genOptions <**> helper)
(progDesc "generate stub configuration and template files")
)
initCommand = command
"init"
(info (initOptions <**> helper)
(progDesc "initialize current project for Headroom")
)
runOptions :: Parser Command
runOptions =
Run
<$> many
(strOption
(long "source-path" <> short 's' <> metavar "PATH" <> help
"path to source code file/directory"
)
)
<*> many
(option
regexReader
(long "excluded-path" <> short 'e' <> metavar "REGEX" <> help
"path to exclude from source code file paths"
)
)
<*> optional
( BuiltInTemplates
<$> option
licenseTypeReader
(long "builtin-templates" <> metavar "TYPE" <> help
("use built-in templates for license type, available options: "
<> T.unpack (T.toLower (allValuesToText @LicenseType))
)
)
<|> TemplateFiles
<$> some
(strOption
(long "template-path" <> short 't' <> metavar "PATH" <> help
"path to license template file/directory"
)
)
)
<*> many
(strOption
(long "variable" <> short 'v' <> metavar "KEY=VALUE" <> help
"value for template variable"
)
)
<*> optional
( flag'
Add
(long "add-headers" <> short 'a' <> help
"only adds missing license headers"
)
<|> flag'
Check
(long "check-headers" <> short 'c' <> help
"check whether existing headers are up-to-date"
)
<|> flag'
Replace
(long "replace-headers" <> short 'r' <> help
"force replace existing license headers"
)
<|> flag'
Drop
(long "drop-headers" <> short 'd' <> help
"drop existing license headers only"
)
)
<*> switch (long "debug" <> help "produce more verbose output")
<*> switch (long "dry-run" <> help "execute dry run (no changes to files)")
genOptions :: Parser Command
genOptions =
Gen
<$> switch
(long "config-file" <> short 'c' <> help
"generate stub YAML config file to stdout"
)
<*> optional
(option
licenseReader
( long "license"
<> short 'l'
<> metavar "licenseType:fileType"
<> help "generate template for license and file type"
)
)
initOptions :: Parser Command
initOptions =
Init
<$> option
licenseTypeReader
(long "license-type" <> short 'l' <> metavar "TYPE" <> help
( "type of open source license, available options: "
<> T.unpack (T.toLower (allValuesToText @LicenseType))
)
)
<*> some
(strOption
(long "source-path" <> short 's' <> metavar "PATH" <> help
"path to source code file/directory"
)
)