optparse-applicative:使用来自选项定义的自定义错误消息生成使用信息

optparse-applicative: Generate usage information with custom error message from options definition

我正在使用存储命令行参数的构造函数 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 获取数据,然后进行进一步验证。

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

可以使用 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 <$> ... 部分)。