如何显示选项缺失参数的错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何显示选项缺失参数的错误?相关的知识,希望对你有一定的参考价值。

我是一个绝对的Clojure初学者,我正在尝试使用clojure.tools.cli库构建一个CLI应用程序。

我的问题是,当没有提供必需参数的选项时,我无法显示任何错误。

我想要的是:

$ java -jar test.jar -m SAMPLE
Given file: SAMPLE

$ java -jar test.jar -m
ERROR: Please provide a file

怎么了:

$ java -jar test.jar -m SAMPLE
Given file: SAMPLE

$ java -jar test.jar -m

$

它没有显示任何东西。

这是我的代码:

(ns obmed-clj.core
  (:require [clojure.tools.cli :refer [parse-opts]])
  (:gen-class))

(def cli-options
  [["-m" "--menu FILE" "Provide menu file path"
    :parse-fn #(if (nil? %) 
                   (println "ERROR: Please provide a file") 
                   %)
    :validate-fn #(println "Given file:" %)]])

(defn -main [& args]
  (parse-opts args cli-options))
答案

你在这里滥用-fn论点。它们的用途是转换“字符串”(在你的情况下,因为你有"--menu FILE"),然后对其进行额外的验证(而是使用:validate [fn msg]代替)。例如:

user=> (def cli-opts [["-m" "--menu FILE" "menu file" 
            :parse-fn #(java.io.File. %) 
            :validate [#(.exists %) "file must exist"]]])
#'user/cli-opts

缺少论点:

user=> (parse-opts ["-m"] cli-opts)
{:arguments [],
 :errors ["Missing required argument for "-m FILE""],
 :options {},
 :summary "  -m, --menu FILE  menu file"}

文件不存在:

user=> (parse-opts ["-m" "XXX"] cli-opts)
{:arguments [],
 :errors ["Failed to validate "-m XXX": file must exist"],
 :options {},
 :summary "  -m, --menu FILE  menu file"}

一切都很好:

user=> (parse-opts ["-m" "/etc/hosts"] cli-opts)
{:arguments [],
 :errors nil,
 :options {:menu #<java.io.File@34d63c80 /etc/hosts>},
 :summary "  -m, --menu FILE  menu file"}

以上是关于如何显示选项缺失参数的错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]

片段不起作用并且有错误

BigQuery 记录类型缺失

如何在不单击的情况下显示片段

为啥选项卡和片段不显示?

操作栏选项卡:使用多次实例化的单个片段时如何传递参数