【问题标题】:optparse-applicative: Generate usage information with custom error message from options definitionoptparse-applicative:使用选项定义中的自定义错误消息生成使用信息
【发布时间】:2016-02-16 00:03:24
【问题描述】:

我正在使用存储命令行参数的构造函数 SrvOpts 填充 Opts 类型:

main :: IO ()
main = join $ customExecParser cf $ info options
           (fullDesc <> header "header" <> footer "footer")
    where cf = defaultPrefs { prefShowHelpOnError=True }

options :: Parser (IO ())
options = subparser $
    command "serve" (info (handleServe <$> (SrvOpts
            <$> strOption [...]

函数handleServe 获取数据,然后进行进一步验证。

如何使用自定义错误消息和从options 内部handleServe 生成的正常optparse-applicative 样式使用信息终止程序?

【问题讨论】:

  • 你总是想终止你的程序吗?或者,如果用户使用了错误的参数或-h,您是否只想显示使用/帮助信息?
  • 解析后我正在检查给定的字符串格式是否正确,如果不是,则希望以基于options 的正常错误消息和使用信息终止。参数处理/解析工作正常。
  • 如果您要单独检查字符串的格式,您可以通过定义自己的ReadM 并将其与option 一起使用(而不是使用strOption)来实现。
  • @ben-james: 好的,但是如果我有更复杂的检查依赖于其他尚未解析的值呢?有没有办法从应用程序options 定义之外呈现从options 生成的“标准错误+使用信息”?

标签: haskell command-line-arguments


【解决方案1】:

可以使用Options.Applicative.Extra中的parserFailure函数来完成:

renderError :: Context -> String -> IO ()                                       
renderError c msg = handleParseResult . Failure $                               
                        parserFailure argPrefs argInfo (ErrorMsg msg) [c]

在当前版本 0.12.0.1 中,Context 必须从 Options.Applicative.Internal 导入,这将改变。 Context 构造函数采用子解析器的名称和用于呈现使用信息的ParserInfoinfo (handleServe &lt;$&gt; ... 部分)。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2015-09-22
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多