2
2
(:require [clojure.data.json :as json]
3
3
[clojure.core.async :refer [>! <!! go chan]]
4
4
[lambdaisland.deep-diff2 :as ddiff]
5
- [clojure.java.io :as io])
5
+ [clojure.java.io :as io]
6
+ [editscript.core :as edcore]
7
+ [editscript.edit :as edit]
8
+ [clojure.tools.cli :refer [parse-opts]])
6
9
(:gen-class ))
7
10
11
+ (def cli-options
12
+ [[" -m" " --mode MODE" " operation mode: 'visual' or 'patch'"
13
+ :default :patch
14
+ :parse-fn #(keyword %)
15
+ :validate [#(% #{:visual :patch }) " possible modes are 'visual' or 'patch'" ]]])
8
16
9
- (defn open- parse
17
+ (defn parse-file
10
18
" open JSON file and parses it"
11
19
[fn ]
12
20
(with-open [f (io/reader fn )]
13
21
(json/read f)))
14
22
23
+ (defn parse-files
24
+ " parses multiple file asynchronously"
25
+ [& files]
26
+ ())
27
+
28
+ (defn patch
29
+ " returns compact patch between objects"
30
+ [json1 json2]
31
+ )
32
+
15
33
(defn diff
16
- " returns diff between JSON files"
34
+ " returns visual diff between JSON files"
17
35
[fn1 fn2]
18
36
(let [c1 (chan )
19
37
c2 (chan )]
20
- (go (>! c1 (open-parse fn1)))
21
- (go (>! c2 (open-parse fn2)))
22
- (ddiff/diff (<!! c1) (<!! c2))))
38
+ (go (>! c1 (parse-file fn1)))
39
+ (go (>! c2 (parse-file fn2)))
40
+ (ddiff/pretty-print
41
+ (ddiff/diff (<!! c1) (<!! c2)))))
23
42
24
43
(defn -main
25
44
" main function"
26
45
[& args]
27
- (if (> 2 (count args))
28
- (println " Not enough parameters!" )
29
- (ddiff/pretty-print
30
- (diff
31
- (first args)
32
- (second args)))))
46
+ (let [{files :arguments
47
+ errors :errors
48
+ {:keys [mode]} :options } (parse-opts args cli-options)]
49
+ (cond
50
+ errors (do (apply println errors)
51
+ (System/exit 1 ))
52
+ (not= 2 (count files)) (do (println " you need to pass two JSON files!" )
53
+ (System/exit 1 ))
54
+ (= :visual mode) (apply diff files)
55
+ (= :patch mode) (apply patch files))))
0 commit comments