繁体   English   中英

如何以更好的方式使用`tools.cli`来解析`clojure`中的命令行参数?

[英]How to parse command line arguments in `clojure` using `tools.cli` in better way?

我在Clojure的新手。 我正在学习使用tools.cli库解析参数。 这是我的代码:

  1 (ns json.core
  2   (:import
  3     (com.fasterxml.jackson.core JsonParseException))
  4   (:require
  5      [cheshire.core :as c]
  6     [clojure.tools.cli :refer [parse-opts]])
  7   (:gen-class))
  8 
  9 (def json-cli-options
 10   [["-j" "--jsonfile INFILE"  :default false]
 11    ["-d" "--data JSON-DATA" :default false]])
 12 
 13 (defn -main
 14   [& args]
 15   (case (first args)
 16     "parsejson" (let [{:keys [jsonfile data]} (get (parse-opts (rest args) json-cli-options) :options)
 17                   file-json (if jsonfile (try (c/parse-string (slurp jsonfile))
 18                                               (catch JsonParseException e (println "Invalid file"))))
 19                   data-json (if data (try (c/parse-string data)
 20                                            (catch JsonParseException e (println "Invalid data"))))
 21                   complete-json (merge file-json data-json)]
 22                   (if (and (not data) (not jsonfile)) (do (println "Pass either json-data or json-file or both") (System/exit 1)))
 23                   (println complete-json))
 24     (println "No argument passed")))

这只是解析json数据的代码。 用户可以使用--jsonfile--data两者都传递json。 用户必须至少选择一个选项,否则它将引发错误。 就像这样:

$ lein run parsejson --jsonfile file.json
;;=> {Name Bob, Gen Male}

$ lein run parsejson --data '{"age":21}'
;;=> {age 21}

$ lein run parsejson --jsonfile file.json --data '{"age":21}'
;;=> {Name Bob, Gen Male, age 21}

$ lein run parsejson 
;;=>Pass either json-data or json-file or both

但是在这种情况下,此代码不会引发错误:

$ lein run parsejson --jsonfile file.json --data

我也想实现此功能。 如果我这样做:

$ lein run parsejson --jsonfile file.json --data
$ lein run parsejson --data '{"age":21}' --jsonfile

该代码应给出一些消息(或错误)。 如何在我的代码中实现此功能? 请提出您的建议。 谢谢。

正如我的旧代码遵循tools.cli doc一样,它将全部保存到地图中。

(defn -main
  ""
  [& args]
  (let [[options extra-args banner]
        (cli args
             ["-j" "--jsonfile" "json file"]
             ["-d" "--data" "json data"]
             ["-h" "--help" "Show help" :default false :flag true]
             ["-v" "--verbose" "debug mode" :default false :flag true])]

    (println options)
    (when (:help options)
      (println banner)
      (System/exit 0))))

out res:--jsonfile 1.json --data'{“ age”:21}'-h

{:help true, :verbose false, :jsonfile 1.json, :data {"age":21}}
Usage:

 Switches                     Default  Desc       
 --------                     -------  ----       
 -j, --jsonfile                        json file  
 -d, --data                            json data  
 -h, --no-help, --help        false    Show help  
 -v, --no-verbose, --verbose  false    debug mode

您应该验证每个标志之后传递的值。 请参阅此处的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM