(ns backup (:require [clojure.edn :as edn] [datomic.require :as req] [datomic.cli :as cli])) (def commands "Map of command names to descriptions of command arguments." {"backup" {:f 'datomic.backup-cli/backup :named #{{:long-name :from-db-uri :required true :doc "URI for backup source"} {:long-name :to-backup-uri :required true :doc "URI for backup destination"}} :positional [:from-db-uri :to-backup-uri]} "list" {:f 'datomic.backup-cli/list-backups :named #{{:long-name :backup-uri :required true :doc "backup URI"}} :positional [:backup-uri :to-db-uri]} "verify" {:f 'datomic.backup-cli/verify-backup :named #{{:long-name :backup-uri :required true :doc "URI of backup"} {:long-name :read-all :required true :doc "Verify that every segment is readable" :coerce #(boolean (edn/read-string %))} {:long-name :t :required true :doc "Point in time (t) to verify" :coerce #(Long. %)}} :positional [:backup-uri :read-all :t]} "restore" {:f 'datomic.backup-cli/restore :named #{{:long-name :from-backup-uri :required true :doc "URI for restore source"} {:long-name :to-db-uri :required true :doc "URI for restore destination"} {:long-name :t :doc "Point in time (t) to restore, defaults to most recent" :default nil :coerce #(Long. %)}} :positional [:from-backup-uri :to-db-uri :t]}}) (defn -main [& [command & cli-args]] (if-let [{:keys [f named positional vararg]} (get commands command)] (let [args (cli/parse-or-exit! command cli-args named positional vararg)] (try (when-let [result (req/require-and-run f args)] (println result)) (catch Throwable t (.printStackTrace t) (cli/fail (.getMessage t)))) (when @cli/exit-after-command (System/exit (if @cli/failed 1 0)))) (binding [*out* *err*] (println (str "Bad command: \"" command "\".")) (System/exit 2))))