{-# LANGUAGE CPP #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Turtle.Options
(
Parser
, ArgName(..)
, CommandName(..)
, ShortName
, Description(..)
, HelpMessage(..)
, switch
, optText
, optLine
, optInt
, optInteger
, optDouble
, optPath
, optRead
, opt
, argText
, argLine
, argInt
, argInteger
, argDouble
, argPath
, argRead
, arg
, subcommand
, subcommandGroup
, options
, optionsExt
) where
import Data.Monoid
import Data.Foldable
import Data.String (IsString)
import Text.Read (readMaybe)
import Data.Text (Text)
import Data.Optional
import Control.Applicative
import Control.Monad.IO.Class
import Filesystem.Path.CurrentOS (FilePath, fromText)
import Options.Applicative (Parser)
import Prelude hiding (FilePath)
import Text.PrettyPrint.ANSI.Leijen (Doc, displayS, renderCompact)
import Turtle.Line (Line)
import qualified Data.Text as Text
import qualified Options.Applicative as Opts
import qualified Options.Applicative.Types as Opts
import qualified Turtle.Line
options :: MonadIO io => Description -> Parser a -> io a
options :: Description -> Parser a -> io a
options desc :: Description
desc parser :: Parser a
parser = IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
(IO a -> io a) -> IO a -> io a
forall a b. (a -> b) -> a -> b
$ ParserPrefs -> ParserInfo a -> IO a
forall a. ParserPrefs -> ParserInfo a -> IO a
Opts.customExecParser (PrefsMod -> ParserPrefs
Opts.prefs PrefsMod
prefs)
(ParserInfo a -> IO a) -> ParserInfo a -> IO a
forall a b. (a -> b) -> a -> b
$ Parser a -> InfoMod a -> ParserInfo a
forall a. Parser a -> InfoMod a -> ParserInfo a
Opts.info (Parser (a -> a)
forall a. Parser (a -> a)
Opts.helper Parser (a -> a) -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
parser)
(Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.headerDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Description -> Doc
getDescription Description
desc)))
where
prefs :: Opts.PrefsMod
#if MIN_VERSION_optparse_applicative(0,13,0)
prefs :: PrefsMod
prefs = PrefsMod
Opts.showHelpOnError PrefsMod -> PrefsMod -> PrefsMod
forall a. Semigroup a => a -> a -> a
<> PrefsMod
Opts.showHelpOnEmpty
#else
prefs = Opts.showHelpOnError
#endif
optionsExt :: MonadIO io => Header -> Footer -> Description -> Version -> Parser a -> io a
optionsExt :: Header -> Footer -> Description -> Version -> Parser a -> io a
optionsExt header :: Header
header footer :: Footer
footer desc :: Description
desc version :: Version
version parser :: Parser a
parser = IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
(IO a -> io a) -> IO a -> io a
forall a b. (a -> b) -> a -> b
$ ParserPrefs -> ParserInfo a -> IO a
forall a. ParserPrefs -> ParserInfo a -> IO a
Opts.customExecParser (PrefsMod -> ParserPrefs
Opts.prefs PrefsMod
prefs)
(ParserInfo a -> IO a) -> ParserInfo a -> IO a
forall a b. (a -> b) -> a -> b
$ Parser a -> InfoMod a -> ParserInfo a
forall a. Parser a -> InfoMod a -> ParserInfo a
Opts.info (Parser ((a -> a) -> a -> a)
forall a. Parser (a -> a)
Opts.helper Parser ((a -> a) -> a -> a) -> Parser (a -> a) -> Parser (a -> a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (a -> a)
forall a. Parser (a -> a)
versionOption Parser (a -> a) -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser a
parser)
(Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.headerDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Header -> Doc
getHeader Header
header)) InfoMod a -> InfoMod a -> InfoMod a
forall a. Semigroup a => a -> a -> a
<>
Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.footerDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Footer -> Doc
getFooter Footer
footer)) InfoMod a -> InfoMod a -> InfoMod a
forall a. Semigroup a => a -> a -> a
<>
Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.progDescDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Description -> Doc
getDescription Description
desc)))
where
versionOption :: Parser (a -> a)
versionOption =
String -> Mod OptionFields (a -> a) -> Parser (a -> a)
forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
Opts.infoOption
(Version -> String
Text.unpack Version
version)
(String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. HasName f => String -> Mod f a
Opts.long "version" Mod OptionFields (a -> a)
-> Mod OptionFields (a -> a) -> Mod OptionFields (a -> a)
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields (a -> a)
forall (f :: * -> *) a. String -> Mod f a
Opts.help "Show version")
prefs :: Opts.PrefsMod
#if MIN_VERSION_optparse_applicative(0,13,0)
prefs :: PrefsMod
prefs = PrefsMod
Opts.showHelpOnError PrefsMod -> PrefsMod -> PrefsMod
forall a. Semigroup a => a -> a -> a
<> PrefsMod
Opts.showHelpOnEmpty
#else
prefs = Opts.showHelpOnError
#endif
newtype ArgName = ArgName { ArgName -> Version
getArgName :: Text }
deriving (String -> ArgName
(String -> ArgName) -> IsString ArgName
forall a. (String -> a) -> IsString a
fromString :: String -> ArgName
$cfromString :: String -> ArgName
IsString)
type ShortName = Char
newtype CommandName = CommandName { CommandName -> Version
getCommandName :: Text }
deriving (String -> CommandName
(String -> CommandName) -> IsString CommandName
forall a. (String -> a) -> IsString a
fromString :: String -> CommandName
$cfromString :: String -> CommandName
IsString)
newtype Description = Description { Description -> Doc
getDescription :: Doc }
deriving (String -> Description
(String -> Description) -> IsString Description
forall a. (String -> a) -> IsString a
fromString :: String -> Description
$cfromString :: String -> Description
IsString)
newtype = { :: Doc }
deriving (String -> Header
(String -> Header) -> IsString Header
forall a. (String -> a) -> IsString a
fromString :: String -> Header
$cfromString :: String -> Header
IsString)
newtype = Fotter { :: Doc }
deriving (String -> Footer
(String -> Footer) -> IsString Footer
forall a. (String -> a) -> IsString a
fromString :: String -> Footer
$cfromString :: String -> Footer
IsString)
type Version = Text
newtype HelpMessage = HelpMessage { HelpMessage -> Version
getHelpMessage :: Text }
deriving (String -> HelpMessage
(String -> HelpMessage) -> IsString HelpMessage
forall a. (String -> a) -> IsString a
fromString :: String -> HelpMessage
$cfromString :: String -> HelpMessage
IsString)
switch
:: ArgName
-> ShortName
-> Optional HelpMessage
-> Parser Bool
switch :: ArgName -> ShortName -> Optional HelpMessage -> Parser Bool
switch argName :: ArgName
argName c :: ShortName
c helpMessage :: Optional HelpMessage
helpMessage
= Mod FlagFields Bool -> Parser Bool
Opts.switch
(Mod FlagFields Bool -> Parser Bool)
-> Mod FlagFields Bool -> Parser Bool
forall a b. (a -> b) -> a -> b
$ (String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
Opts.long (String -> Mod FlagFields Bool)
-> (ArgName -> String) -> ArgName -> Mod FlagFields Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack (Version -> String) -> (ArgName -> Version) -> ArgName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArgName -> Version
getArgName) ArgName
argName
Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> ShortName -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => ShortName -> Mod f a
Opts.short ShortName
c
Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> (HelpMessage -> Mod FlagFields Bool)
-> Optional HelpMessage -> Mod FlagFields Bool
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
Opts.help (String -> Mod FlagFields Bool)
-> (HelpMessage -> String) -> HelpMessage -> Mod FlagFields Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack (Version -> String)
-> (HelpMessage -> Version) -> HelpMessage -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HelpMessage -> Version
getHelpMessage) Optional HelpMessage
helpMessage
opt :: (Text -> Maybe a)
-> ArgName
-> ShortName
-> Optional HelpMessage
-> Parser a
opt :: (Version -> Maybe a)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser a
opt argParse :: Version -> Maybe a
argParse argName :: ArgName
argName c :: ShortName
c helpMessage :: Optional HelpMessage
helpMessage
= ReadM a -> Mod OptionFields a -> Parser a
forall a. ReadM a -> Mod OptionFields a -> Parser a
Opts.option ((Version -> Maybe a) -> ReadM a
forall a. (Version -> Maybe a) -> ReadM a
argParseToReadM Version -> Maybe a
argParse)
(Mod OptionFields a -> Parser a) -> Mod OptionFields a -> Parser a
forall a b. (a -> b) -> a -> b
$ String -> Mod OptionFields a
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
Opts.metavar (Version -> String
Text.unpack (Version -> Version
Text.toUpper (ArgName -> Version
getArgName ArgName
argName)))
Mod OptionFields a -> Mod OptionFields a -> Mod OptionFields a
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields a
forall (f :: * -> *) a. HasName f => String -> Mod f a
Opts.long (Version -> String
Text.unpack (ArgName -> Version
getArgName ArgName
argName))
Mod OptionFields a -> Mod OptionFields a -> Mod OptionFields a
forall a. Semigroup a => a -> a -> a
<> ShortName -> Mod OptionFields a
forall (f :: * -> *) a. HasName f => ShortName -> Mod f a
Opts.short ShortName
c
Mod OptionFields a -> Mod OptionFields a -> Mod OptionFields a
forall a. Semigroup a => a -> a -> a
<> (HelpMessage -> Mod OptionFields a)
-> Optional HelpMessage -> Mod OptionFields a
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Mod OptionFields a
forall (f :: * -> *) a. String -> Mod f a
Opts.help (String -> Mod OptionFields a)
-> (HelpMessage -> String) -> HelpMessage -> Mod OptionFields a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack (Version -> String)
-> (HelpMessage -> Version) -> HelpMessage -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HelpMessage -> Version
getHelpMessage) Optional HelpMessage
helpMessage
optRead :: Read a => ArgName -> ShortName -> Optional HelpMessage -> Parser a
optRead :: ArgName -> ShortName -> Optional HelpMessage -> Parser a
optRead = (Version -> Maybe a)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser a
forall a.
(Version -> Maybe a)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser a
opt (String -> Maybe a
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe a) -> (Version -> String) -> Version -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack)
optInt :: ArgName -> ShortName -> Optional HelpMessage -> Parser Int
optInt :: ArgName -> ShortName -> Optional HelpMessage -> Parser Int
optInt = ArgName -> ShortName -> Optional HelpMessage -> Parser Int
forall a.
Read a =>
ArgName -> ShortName -> Optional HelpMessage -> Parser a
optRead
optInteger :: ArgName -> ShortName -> Optional HelpMessage -> Parser Integer
optInteger :: ArgName -> ShortName -> Optional HelpMessage -> Parser Integer
optInteger = ArgName -> ShortName -> Optional HelpMessage -> Parser Integer
forall a.
Read a =>
ArgName -> ShortName -> Optional HelpMessage -> Parser a
optRead
optDouble :: ArgName -> ShortName -> Optional HelpMessage -> Parser Double
optDouble :: ArgName -> ShortName -> Optional HelpMessage -> Parser Double
optDouble = ArgName -> ShortName -> Optional HelpMessage -> Parser Double
forall a.
Read a =>
ArgName -> ShortName -> Optional HelpMessage -> Parser a
optRead
optText :: ArgName -> ShortName -> Optional HelpMessage -> Parser Text
optText :: ArgName -> ShortName -> Optional HelpMessage -> Parser Version
optText = (Version -> Maybe Version)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser Version
forall a.
(Version -> Maybe a)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser a
opt Version -> Maybe Version
forall a. a -> Maybe a
Just
optLine :: ArgName -> ShortName -> Optional HelpMessage -> Parser Line
optLine :: ArgName -> ShortName -> Optional HelpMessage -> Parser Line
optLine = (Version -> Maybe Line)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser Line
forall a.
(Version -> Maybe a)
-> ArgName -> ShortName -> Optional HelpMessage -> Parser a
opt Version -> Maybe Line
Turtle.Line.textToLine
optPath :: ArgName -> ShortName -> Optional HelpMessage -> Parser FilePath
optPath :: ArgName -> ShortName -> Optional HelpMessage -> Parser FilePath
optPath argName :: ArgName
argName short :: ShortName
short msg :: Optional HelpMessage
msg = (Version -> FilePath) -> Parser Version -> Parser FilePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Version -> FilePath
fromText (ArgName -> ShortName -> Optional HelpMessage -> Parser Version
optText ArgName
argName ShortName
short Optional HelpMessage
msg)
arg :: (Text -> Maybe a)
-> ArgName
-> Optional HelpMessage
-> Parser a
arg :: (Version -> Maybe a) -> ArgName -> Optional HelpMessage -> Parser a
arg argParse :: Version -> Maybe a
argParse argName :: ArgName
argName helpMessage :: Optional HelpMessage
helpMessage
= ReadM a -> Mod ArgumentFields a -> Parser a
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
Opts.argument ((Version -> Maybe a) -> ReadM a
forall a. (Version -> Maybe a) -> ReadM a
argParseToReadM Version -> Maybe a
argParse)
(Mod ArgumentFields a -> Parser a)
-> Mod ArgumentFields a -> Parser a
forall a b. (a -> b) -> a -> b
$ String -> Mod ArgumentFields a
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
Opts.metavar (Version -> String
Text.unpack (Version -> Version
Text.toUpper (ArgName -> Version
getArgName ArgName
argName)))
Mod ArgumentFields a
-> Mod ArgumentFields a -> Mod ArgumentFields a
forall a. Semigroup a => a -> a -> a
<> (HelpMessage -> Mod ArgumentFields a)
-> Optional HelpMessage -> Mod ArgumentFields a
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Mod ArgumentFields a
forall (f :: * -> *) a. String -> Mod f a
Opts.help (String -> Mod ArgumentFields a)
-> (HelpMessage -> String) -> HelpMessage -> Mod ArgumentFields a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack (Version -> String)
-> (HelpMessage -> Version) -> HelpMessage -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HelpMessage -> Version
getHelpMessage) Optional HelpMessage
helpMessage
argRead :: Read a => ArgName -> Optional HelpMessage -> Parser a
argRead :: ArgName -> Optional HelpMessage -> Parser a
argRead = (Version -> Maybe a) -> ArgName -> Optional HelpMessage -> Parser a
forall a.
(Version -> Maybe a) -> ArgName -> Optional HelpMessage -> Parser a
arg (String -> Maybe a
forall a. Read a => String -> Maybe a
readMaybe (String -> Maybe a) -> (Version -> String) -> Version -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> String
Text.unpack)
argInt :: ArgName -> Optional HelpMessage -> Parser Int
argInt :: ArgName -> Optional HelpMessage -> Parser Int
argInt = ArgName -> Optional HelpMessage -> Parser Int
forall a. Read a => ArgName -> Optional HelpMessage -> Parser a
argRead
argInteger :: ArgName -> Optional HelpMessage -> Parser Integer
argInteger :: ArgName -> Optional HelpMessage -> Parser Integer
argInteger = ArgName -> Optional HelpMessage -> Parser Integer
forall a. Read a => ArgName -> Optional HelpMessage -> Parser a
argRead
argDouble :: ArgName -> Optional HelpMessage -> Parser Double
argDouble :: ArgName -> Optional HelpMessage -> Parser Double
argDouble = ArgName -> Optional HelpMessage -> Parser Double
forall a. Read a => ArgName -> Optional HelpMessage -> Parser a
argRead
argText :: ArgName -> Optional HelpMessage -> Parser Text
argText :: ArgName -> Optional HelpMessage -> Parser Version
argText = (Version -> Maybe Version)
-> ArgName -> Optional HelpMessage -> Parser Version
forall a.
(Version -> Maybe a) -> ArgName -> Optional HelpMessage -> Parser a
arg Version -> Maybe Version
forall a. a -> Maybe a
Just
argLine :: ArgName -> Optional HelpMessage -> Parser Line
argLine :: ArgName -> Optional HelpMessage -> Parser Line
argLine = (Version -> Maybe Line)
-> ArgName -> Optional HelpMessage -> Parser Line
forall a.
(Version -> Maybe a) -> ArgName -> Optional HelpMessage -> Parser a
arg Version -> Maybe Line
Turtle.Line.textToLine
argPath :: ArgName -> Optional HelpMessage -> Parser FilePath
argPath :: ArgName -> Optional HelpMessage -> Parser FilePath
argPath argName :: ArgName
argName msg :: Optional HelpMessage
msg = (Version -> FilePath) -> Parser Version -> Parser FilePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Version -> FilePath
fromText (ArgName -> Optional HelpMessage -> Parser Version
argText ArgName
argName Optional HelpMessage
msg)
argParseToReadM :: (Text -> Maybe a) -> Opts.ReadM a
argParseToReadM :: (Version -> Maybe a) -> ReadM a
argParseToReadM f :: Version -> Maybe a
f = do
String
s <- ReadM String
Opts.readerAsk
case Version -> Maybe a
f (String -> Version
Text.pack String
s) of
Just a :: a
a -> a -> ReadM a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
Nothing -> ParseError -> ReadM a
forall a. ParseError -> ReadM a
Opts.readerAbort ParseError
Opts.ShowHelpText
subcommand :: CommandName -> Description -> Parser a -> Parser a
subcommand :: CommandName -> Description -> Parser a -> Parser a
subcommand cmdName :: CommandName
cmdName desc :: Description
desc p :: Parser a
p =
Mod CommandFields a -> Parser a
forall a. Mod CommandFields a -> Parser a
Opts.hsubparser (String -> ParserInfo a -> Mod CommandFields a
forall a. String -> ParserInfo a -> Mod CommandFields a
Opts.command String
name ParserInfo a
info Mod CommandFields a -> Mod CommandFields a -> Mod CommandFields a
forall a. Semigroup a => a -> a -> a
<> String -> Mod CommandFields a
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
Opts.metavar String
name)
where
name :: String
name = Version -> String
Text.unpack (CommandName -> Version
getCommandName CommandName
cmdName)
info :: ParserInfo a
info = Parser a -> InfoMod a -> ParserInfo a
forall a. Parser a -> InfoMod a -> ParserInfo a
Opts.info Parser a
p (Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.progDescDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Description -> Doc
getDescription Description
desc)))
subcommandGroup :: forall a. Description -> [(CommandName, Description, Parser a)] -> Parser a
subcommandGroup :: Description -> [(CommandName, Description, Parser a)] -> Parser a
subcommandGroup name :: Description
name cmds :: [(CommandName, Description, Parser a)]
cmds =
Mod CommandFields a -> Parser a
forall a. Mod CommandFields a -> Parser a
Opts.hsubparser (String -> Mod CommandFields a
forall a. String -> Mod CommandFields a
Opts.commandGroup String
name' Mod CommandFields a -> Mod CommandFields a -> Mod CommandFields a
forall a. Semigroup a => a -> a -> a
<> ((CommandName, Description, Parser a) -> Mod CommandFields a)
-> [(CommandName, Description, Parser a)] -> Mod CommandFields a
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (CommandName, Description, Parser a) -> Mod CommandFields a
f [(CommandName, Description, Parser a)]
cmds Mod CommandFields a -> Mod CommandFields a -> Mod CommandFields a
forall a. Semigroup a => a -> a -> a
<> String -> Mod CommandFields a
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
Opts.metavar String
metavar)
where
f :: (CommandName, Description, Parser a) -> Opts.Mod Opts.CommandFields a
f :: (CommandName, Description, Parser a) -> Mod CommandFields a
f (cmdName :: CommandName
cmdName, desc :: Description
desc, p :: Parser a
p) =
String -> ParserInfo a -> Mod CommandFields a
forall a. String -> ParserInfo a -> Mod CommandFields a
Opts.command
(Version -> String
Text.unpack (CommandName -> Version
getCommandName CommandName
cmdName))
(Parser a -> InfoMod a -> ParserInfo a
forall a. Parser a -> InfoMod a -> ParserInfo a
Opts.info Parser a
p (Maybe Doc -> InfoMod a
forall a. Maybe Doc -> InfoMod a
Opts.progDescDoc (Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Description -> Doc
getDescription Description
desc))))
metavar :: String
metavar :: String
metavar = Version -> String
Text.unpack (Version -> [Version] -> Version
Text.intercalate " | " (((CommandName, Description, Parser a) -> Version)
-> [(CommandName, Description, Parser a)] -> [Version]
forall a b. (a -> b) -> [a] -> [b]
map (CommandName, Description, Parser a) -> Version
g [(CommandName, Description, Parser a)]
cmds))
where
g :: (CommandName, Description, Parser a) -> Text
g :: (CommandName, Description, Parser a) -> Version
g (cmdName :: CommandName
cmdName, _, _) = CommandName -> Version
getCommandName CommandName
cmdName
name' :: String
name' :: String
name' = SimpleDoc -> ShowS
displayS (Doc -> SimpleDoc
renderCompact (Description -> Doc
getDescription Description
name)) ""