diff options
| author | Akshay Nair <phenax5@gmail.com> | 2026-06-23 23:53:19 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2026-06-23 23:53:47 +0530 |
| commit | 4b6b717e88f9ee24d45d7cfdc66b01bf4a4951eb (patch) | |
| tree | a84087800b7cbca4f299520fa4739be44e3ef2c2 /scripts/utils.clj | |
| parent | 7502d1e84ae9956356e1578f65d11a8326ce3ec0 (diff) | |
| download | kakoune-config-4b6b717e88f9ee24d45d7cfdc66b01bf4a4951eb.tar.gz kakoune-config-4b6b717e88f9ee24d45d7cfdc66b01bf4a4951eb.zip | |
Refactor utils.sh to clojure
Diffstat (limited to 'scripts/utils.clj')
| -rwxr-xr-x | scripts/utils.clj | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/scripts/utils.clj b/scripts/utils.clj new file mode 100755 index 0000000..ab1cf70 --- /dev/null +++ b/scripts/utils.clj @@ -0,0 +1,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)))))) |
