11(ns json-diff.core
2- (:require [clojure.data.json :as json]
2+ (:require [clojure.java.io :as io]
3+ [clojure.data.json :as json]
34 [clojure.core.async :refer [>! <!! go chan]]
5+ [clojure.tools.cli :refer [parse-opts]]
46 [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+
99 (:gen-class ))
1010
1111(def cli-options
1414 :parse-fn #(keyword %)
1515 :validate [#(% #{:visual :patch }) " possible modes are 'visual' or 'patch'" ]]])
1616
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-
2317(defn parse-async
2418 " opens JSON file and parses it asynchronously, returns channel"
2519 [file-name]
26- (go (parse file-name)))
20+ (go (with-open [f (io/reader file-name)]
21+ (json/read f))))
2722
2823(defn process
2924 [f & files]
3025 (->> files
3126 (map parse-async)
32- (map #( <!! %) )
33- (map f)))
27+ (map <!!)
28+ (apply f)))
3429
3530(defn patch
36- " returns compact patch between two JSON objects"
31+ " prints compact patch between two JSON objects"
3732 [left right]
38- (println (edcore/ diff left right {:algo :quick })))
33+ (println (compact- diff left right {:algo :quick })))
3934
4035(defn diff
41- " returns visual diff between two JSON objects"
36+ " prints visual diff between two JSON objects"
4237 [left right]
4338 (ddiff/pretty-print
4439 (ddiff/diff left right)))
4540
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+
4647(defn -main
4748 " main function"
4849 [& args]
4950 (let [{files :arguments
5051 errors :errors
5152 {:keys [mode]} :options } (parse-opts args cli-options)]
5253 (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 )
5756 (= :visual mode) (apply process diff files)
5857 (= :patch mode) (apply process patch files))))
0 commit comments