私は初心者でクロージャーです。私はtools.cliライブラリを使用して引数を解析することを学んでいます。ここに私のコードはあります:`tools.cli`を使って` clojure`のコマンドライン引数をより良い方法で解析するには?
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または-またはの両方を使用してjsonを渡すことができます。。ユーザーは少なくとも1つのオプションを選択する必要があります。それ以外の場合は、エラーが発生します。それはこのようなものだ:
$ 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
コードには何らかのメッセージ(またはエラー)が表示されるはずです。私のコードでこのことをどのように実装できますか?あなたの提案をお願いします。ありがとう。
あなたの答えをありがとう。私は、私の問題を解決するとは思わない。 ':flag'は 'parse-opts'関数では使用できません。 –