【问题标题】:How do you provide a specific error message with optparse-applicative when multiple mutually exclusive options are provided?当提供多个互斥选项时,如何使用 optparse-applicative 提供特定的错误消息?
【发布时间】:2015-07-25 07:12:54
【问题描述】:

使用optparse-applicative 指定互斥选项很容易:

data Exclusive = E1 | E2

exclusiveParser :: Parser ExclusiveOption
exclusiveParser = 
        (flag' E1 (short 'e1')
    <|> (flag' E2 (short 'e2')

上述解析器将解析-e1-e2,但不能同时解析两者。当同时提供-e1-e2 时,默认的 optparse-applicative 操作是打印应用程序的使用消息。我想向用户提供一条特定的错误消息,告知他们不能同时提供-e1-e2,但我没有看到明显的方法。

任何建议(或解决方案)将不胜感激?

【问题讨论】:

    标签: haskell command-line-arguments


    【解决方案1】:

    我不熟悉 optparse-applicative,所以我不确定它提供了哪些错误打印工具。 (有时解析器组合器库提供了一个原语,可以更改打印的错误,但我在快速浏览 optparse-applicative 文档时没有看到任何相关内容。我很可能错过了它。)

    但如果库本身没有可用的内容,您可以随时通过接受这两个标志来打印自己的消息;例如

    data Exclusive = E1 | E2 | Both
    exclusiveParser
         =  (flag' E1 (short 'e'))
        <|> (flag' E2 (short 'f'))
        <|> (flag' Both (short 'e') <* flag' Both (short 'f'))
    

    然后在您的顶级处理程序中(即一旦所有选项都被解析),如果您看到Both,您可以在那个时候发出您自己制作的错误消息。

    【讨论】:

    • @ChristopherLewis 哦,当然;如果您愿意,您可以使用data Exclusive = E1 | E2 并返回Maybe ExclusiveExcept CommandLineParsingError Exclusive 或其他任何东西,这可能是一个更简洁的设计——尤其是如果它意味着您可以编写解析器和错误报告应用程序。跨度>
    • [删除了之前的评论:回车太快了,但它的内容基本上包含在这个评论中。]我将此标记为正确答案:经过仔细检查,我找不到更好的处理方法这个情况。但是,在 sum 类型中编码失败指示符确实让我觉得不好。我应该指出,自从我最初提出这个问题以来,optparse-applicative 的错误消息已经得到改进(添加)。从 0.14 版开始,问题中的解析器将输出错误 Invalid option `-e2'
    • 我正在使用版本 1.2.1 的解决方案。在解析命令行选项之前抛出错误 Invalid option `-e2'。因此,我无法检查 Both。如何获得两者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2012-03-05
    • 2015-12-09
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多