Convenience functions for parsing and generating YAML. | (ns metabase.util.yaml (:refer-clojure :exclude [load]) (:require ^{:clj-kondo/ignore [:discouraged-namespace]} [clj-yaml.core :as yaml] [clojure.java.io :as io] [clojure.string :as str] [metabase.util :as u] [metabase.util.date-2 :as u.date] [metabase.util.files :as u.files] [metabase.util.log :as log]) (:import (java.nio.file Files Path) (java.time.temporal Temporal))) |
(set! *warn-on-reflection* true) | |
Returns x with lazy seqs converted to vectors wherever they appear in the data structure. | (defn- vectorized [x] (cond (map? x) (update-vals x vectorized) (sequential? x) (mapv vectorized x) :else x)) |
(extend-protocol yaml/YAMLCodec Temporal (encode [data] (u.date/format data))) | |
Returns YAML parsed from file/file-like/path f, with options passed to clj-yaml. | (defn from-file [f & {:as opts}] (when (.exists (io/file f)) (with-open [r (io/reader f)] (vectorized (yaml/parse-stream r opts))))) |
Returns a YAML string from Clojure value x | (defn generate-string [x & {:as opts}] (yaml/generate-string x opts)) |
Returns a Clojure object parsed from YAML in string s with opts passed to clj-yaml. | (defn parse-string [s & {:as opts}] (vectorized (yaml/parse-string s opts))) |
Legacy API: | |
Load YAML at path | (defn load ([f] (load identity f)) ([constructor ^Path f] (try (-> f .toUri slurp parse-string constructor) (catch Exception e (log/errorf "Error parsing %s:\n%s" (.getFileName f) (or (some-> e ex-data (select-keys [:error :value]) u/pprint-to-str) e)) (throw e))))) |
Load and parse all YAMLs in | (defn load-dir ([dir] (load-dir dir identity)) ([dir constructor] (u.files/with-open-path-to-resource [dir dir] (with-open [ds (Files/newDirectoryStream dir)] (->> ds (filter (comp #(str/ends-with? % ".yaml") u/lower-case-en (memfn ^Path getFileName))) (mapv (partial load constructor))))))) |