2016-07-24 4 views
0

私は初心者でクロージャーです。私は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 

コードには何らかのメッセージ(またはエラー)が表示されるはずです。私のコードでこのことをどのように実装できますか?あなたの提案をお願いします。ありがとう。

答えて

0

私の古いコードはtools.cliに従ってください。それはすべて地図に保存されます。 --jsonfile 1.json --data '{ "年齢":21}'

{: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 
+0

あなたの答えをありがとう。私は、私の問題を解決するとは思わない。 ':flag'は 'parse-opts'関数では使用できません。 –

0

あなたは各フラグの後に渡された値を検証すべきである-h RESアウト

(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)))) 

。例については、hereを参照してください。

関連する問題