aboutsummaryrefslogtreecommitdiff
path: root/scripts/utils.clj
blob: ab1cf70c8bea97bc7d0331318000d26391b1979a (plain) (blame)
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
42
43
#!/usr/bin/env bb

(require '[clojure.java.io :as io])

(defn dirname [path] (.getParent (io/file path)))

(defn dir-has-file? [dir filenames]
  (some
   (fn [file] (.exists (io/file (str dir "/" file))))
   filenames))

(defn find-closest [dir filenames]
  (cond
    (= dir "/") nil
    (= dir ".") nil
    (= dir "") nil
    (dir-has-file? dir filenames) dir
    :else (find-closest (dirname dir) filenames)))

(defn normalize-dir-path [dir]
  (.getAbsolutePath (io/file (if (empty? dir) "." dir))))

(defn cmd-find-closest [[dir & filenames]]
  (let [init-dir (normalize-dir-path dir)]
    (when-let [found-dir (find-closest init-dir filenames)]
      (println found-dir))))

(defn cmd-find-closest-or-dir [[dir & filenames]]
  (let [init-dir (normalize-dir-path dir)]
    (if-let [found-dir (find-closest init-dir filenames)]
      (println found-dir)
      (println init-dir))))

(def commands
  {"find-closest" cmd-find-closest
   "find-closest-or-dir" cmd-find-closest-or-dir})

(let [[cmd & args] *command-line-args*]
  (if-let [command-fn (commands cmd)]
    (command-fn args)
    (binding [*out* *err*]
      (println (str "invalid command: " (or cmd "")))
      (println (str "Valid commands: " (keys commands))))))