1
1
(ns json-diff.core
2
- (:require [clojure.data.json :as json]
2
+ (:require [clojure.java.io :as io]
3
+ [clojure.data.json :as json]
3
4
[clojure.core.async :refer [>! <!! go chan]]
5
+ [clojure.tools.cli :refer [parse-opts]]
4
6
[lambdaisland.deep-diff2 :as ddiff]
5
- [clojure.java.io :as io]
6
- [editscript.core :as edcore]
7
- ; ; [editscript.edit :as edit]
8
- [clojure.tools.cli :refer [parse-opts]])
7
+ [editscript.core :refer [diff] :rename {diff compact-diff}])
8
+
9
9
(:gen-class ))
10
10
11
11
(def cli-options
14
14
:parse-fn #(keyword %)
15
15
:validate [#(% #{:visual :patch }) " possible modes are 'visual' or 'patch'" ]]])
16
16
17
- (defn parse
18
- " opens JSON file and parses it"
19
- [file-name]
20
- (with-open [f (io/reader file-name)]
21
- (json/read f)))
22
-
23
17
(defn parse-async
24
18
" opens JSON file and parses it asynchronously, returns channel"
25
19
[file-name]
26
- (go (parse file-name)))
20
+ (go (with-open [f (io/reader file-name)]
21
+ (json/read f))))
27
22
28
23
(defn process
29
24
[f & files]
30
25
(->> files
31
26
(map parse-async)
32
- (map #( <!! %) )
33
- (map f)))
27
+ (map <!!)
28
+ (apply f)))
34
29
35
30
(defn patch
36
- " returns compact patch between two JSON objects"
31
+ " prints compact patch between two JSON objects"
37
32
[left right]
38
- (println (edcore/ diff left right {:algo :quick })))
33
+ (println (compact- diff left right {:algo :quick })))
39
34
40
35
(defn diff
41
- " returns visual diff between two JSON objects"
36
+ " prints visual diff between two JSON objects"
42
37
[left right]
43
38
(ddiff/pretty-print
44
39
(ddiff/diff left right)))
45
40
41
+ (defn print-error-exit
42
+ " prints error message and exits with error code"
43
+ [msg code]
44
+ (println msg)
45
+ (System/exit code))
46
+
46
47
(defn -main
47
48
" main function"
48
49
[& args]
49
50
(let [{files :arguments
50
51
errors :errors
51
52
{:keys [mode]} :options } (parse-opts args cli-options)]
52
53
(cond
53
- errors (do (apply println errors)
54
- (System/exit 1 ))
55
- (not= 2 (count files)) (do (println " you need to pass two JSON files!" )
56
- (System/exit 1 ))
54
+ errors (print-error-exit (str errors) 1 )
55
+ (not= 2 (count files)) (print-error-exit " you need to pass two JSON files!" 1 )
57
56
(= :visual mode) (apply process diff files)
58
57
(= :patch mode) (apply process patch files))))
0 commit comments