optparse-applicative: отображение справки для программ, вызываемых без аргументов


Я использую optparse-applicative версию 0.7.0.2.

Я хочу написать синтаксический анализатор, который принимает некоторые обязательные параметры, но при вызове без параметров он показывает как Использование, так и помощь, в отличие от простого использования (то есть я хочу, чтобы вызов без параметров вел себя как вызов с --help).

Я не могу понять, как это сделать, Даже если документация говорит, что это возможно :

Параметр hello в этом примере является обязательным (поскольку он не имеет один значение по умолчанию), так что запуск программы без каких-либо аргументов будет отображение текста справки

Есть ли рабочий пример этого? Тот, что в основной документации, не работает для меня (он печатает только использование.)

3 6

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)

На основе комментария по вопросу, связанному с принятым ответом.