optparse-applicative: отображение справки для программ, вызываемых без аргументов
Я использую optparse-applicative
версию 0.7.0.2.
Я хочу написать синтаксический анализатор, который принимает некоторые обязательные параметры, но при вызове без параметров он показывает как Использование, так и помощь, в отличие от простого использования (то есть я хочу, чтобы вызов без параметров вел себя как вызов с --help
).
Я не могу понять, как это сделать, Даже если документация говорит, что это возможно :
Параметр hello в этом примере является обязательным (поскольку он не имеет один значение по умолчанию), так что запуск программы без каких-либо аргументов будет отображение текста справки
Есть ли рабочий пример этого? Тот, что в основной документации, не работает для меня (он печатает только использование.)
3 ответа:
В настоящее время, похоже, единственный способ сделать это-создать свою собственную версию
customExecParser
из опций .Аппликативный.Дополнительный модуль . Существуетоткрытый вопрос , чтобы сделать это проще.Что-то вроде этого должно быть довольно близко к тому, что вы ищете:
import Options.Applicative import Options.Applicative.Help as AH import Options.Applicative.Types as AT import System.Environment (getArgs, getProgName) import System.Exit (exitWith, ExitCode(..)) import System.IO (hPutStr, stderr) execParserWithHelp :: ParserPrefs -> ParserInfo a -> IO a execParserWithHelp pprefs pinfo = do args <- getArgs case execParserPure pprefs pinfo args of Right a -> return a Left failure -> do progn <- getProgName msg <- AT.errMessage failure progn let extra = if null args then AH.parserHelpText pprefs pinfo else "" let c = errExitCode failure case c of ExitSuccess -> putStr (msg ++ extra) _ -> hPutStr stderr (msg ++ extra) exitWith c main :: IO () main = execParserWithHelp (prefs idm) opts >>= run opts :: ParserInfo Command opts = info (commands <**> helper) idm run :: Command -> IO () run = ...
Это в основном просто
customExecParser
с небольшим блоком, который проверяет, пусты ли args. Если они есть, он отображает справку синтаксического анализатора.
Возрождение старой темы, но я добавил преф
showHelpOnEmpty
для этого, так что теперь все просто. Дан парсерp :: ParserInfo a
run :: IO a run = customExecParser (prefs showHelpOnEmpty) p
Если вы просто хотите вывести
--help
вывод на все ошибки, включая когда программа выполняется без аргументов, то замените вызовыexecParser
с вызовамиshowHelpOnErrorExecParser
, определяется-- | A version of 'execParser' which shows full help on error. -- -- The regular 'execParser' only prints usage on error, which doesn't -- include the options, subcommands, or mention of the help switch -- @--help@. showHelpOnErrorExecParser :: ParserInfo a -> IO a showHelpOnErrorExecParser = customExecParser (prefs showHelpOnError)
На основе комментария по вопросу, связанному с принятым ответом.