tablize-1.0.0: src/Options.hs
module Options
( Options(..)
, parser
) where
import Data.Char
import Options.Applicative
import qualified Data.Text as T
-- | Command-line options.
data Options = Options
{ optFile :: Maybe String
, optHorizontal :: T.Text
, optVertical :: T.Text
, optAlignment :: T.Text }
-- | Relevant file extensions options.
parseFile :: Parser (Maybe String) -- ^ parser
parseFile = optional $ strArgument (metavar "FILE")
-- | Helper funciton to remove all whitespace from a string.
noSpace :: String -- ^ old string
-> String -- ^ new string
noSpace = filter (not . isSpace)
-- | Parse horizontal decoration.
parseHorizontal :: Parser T.Text -- ^ parser
parseHorizontal = fmap (T.pack . noSpace) $ strOption
$ short 'x'
<> long "horizontal"
<> value "union(only(1),outer)"
<> metavar "HDECOR"
<> help "Horizontal decoration"
<> showDefault
-- | Relevant file extensions options.
parseVertical :: Parser T.Text -- ^ parser
parseVertical = fmap (T.pack . noSpace) $ strOption
$ short 'y'
<> long "vertical"
<> value "all"
<> metavar "VDECOR"
<> help "Vertical decoration"
<> showDefault
-- | Relevant file extensions options.
parseAlignment :: Parser T.Text -- ^ parser
parseAlignment = fmap (T.pack . noSpace) $ strOption
$ short 'a'
<> long "alignment"
<> value ""
<> metavar "ALIGNS"
<> help "Comma-separated list of column alignments. E.g.: left,right"
<> showDefault
-- | Command-line user interface.
optionsParser :: Parser Options -- ^ parser
optionsParser = Options
<$> parseFile
<*> parseHorizontal
<*> parseVertical
<*> parseAlignment
-- | Parser of the command-line options.
parser :: ParserInfo Options -- ^ parser
parser = info (helper <*> optionsParser) (header top <> fullDesc)
where top = "tablize - CSV file pretty-printer"