-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
engine.clj
41 lines (35 loc) · 1.46 KB
/
engine.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(ns clj-holmes.engine
(:require [clj-holmes.filesystem :as filesystem]
[clj-holmes.output.main :as output]
[clj-holmes.rules.engine :as rules.engine]
[clj-holmes.rules.loader :as rules.loader]
[progrock.core :as pr])
(:import (java.io StringWriter)))
(def ^:private bar (atom (pr/progress-bar 100)))
(def ^:private progress-count (atom 0))
(add-watch
progress-count
:print (fn [_ _ _ new-state]
(-> @bar (pr/tick new-state) pr/print)))
(defn ^:private count-progress-size [files]
(let [amount-of-files (count files)]
(if (zero? amount-of-files)
1
(->> amount-of-files (/ 100) float))))
(defn ^:private check-rules-in-code-structure [code-structure rules progress-size]
(let [run (partial rules.engine/run code-structure)
result (->> rules (pmap run) (filterv :result))]
(swap! progress-count (partial + progress-size))
result))
(defn scan* [opts]
(let [code-structures (filesystem/code-structure-from-clj-files-in-directory! opts)
rules (rules.loader/init! opts)
progress-size (count-progress-size code-structures)
scans-results (->> code-structures
(pmap #(check-rules-in-code-structure % rules progress-size))
(reduce concat))]
(output/output scans-results opts)))
(defn scan [{:keys [verbose] :as opts}]
(let [out (if verbose *out* (new StringWriter))]
(binding [*out* out]
(scan* opts))))