diff --git a/src/donut/dbxray/generate/malli.cljc b/src/donut/dbxray/generate/malli.cljc index e4ba004..dc82c4e 100644 --- a/src/donut/dbxray/generate/malli.cljc +++ b/src/donut/dbxray/generate/malli.cljc @@ -1,5 +1,6 @@ (ns donut.dbxray.generate.malli (:require + [clojure.string :as str] [camel-snake-kebab.core :as csk] [inflections.core :as inflections])) @@ -9,7 +10,8 @@ :clob 'string? :text 'string? :varchar 'string? - :timestamp 'inst?}) + :timestamp 'inst? + :uuid 'uuid?}) (defn- table-spec-name [table-name] @@ -22,28 +24,36 @@ (keyword (name table-name) (name column-name))) (defn- column-spec - [xray table-name column-name] - (let [{:keys [column-type primary-key? nullable? refers-to]} (get-in xray [table-name :columns column-name])] - [(column-spec-name table-name column-name) - {:optional? (boolean nullable?)} + ([xray table-name column-name] + (column-spec nil xray table-name column-name)) - (cond - refers-to - (last (column-spec xray (first refers-to) (second refers-to))) + ([enums xray table-name column-name] + (let [{:keys [column-type primary-key? nullable? refers-to]} (get-in xray [table-name :columns column-name])] + [(column-spec-name table-name column-name) + {:optional? (boolean nullable?)} - (and (= :integer column-type) primary-key?) - (:integer-pk column-types) + (cond + refers-to + (last (column-spec xray (first refers-to) (second refers-to))) - :else - (column-type column-types [:TODO/column-type-not-recognized column-type]))])) + (and (= :integer column-type) primary-key?) + (:integer-pk column-types) + + ;; :enum type definition + (str/includes? column-type ".") + (let [column (-> column-type (name) (str/replace #"\"" ""))] + (get enums column)) + + :else + (column-type column-types [:TODO/column-type-not-recognized column-type]))]))) (defn generate - [{:keys [tables table-order]}] + [{:keys [enums tables table-order]}] (->> table-order (mapv (fn [table-name] (let [{:keys [column-order]} (table-name tables)] (list 'def (table-spec-name table-name) (->> column-order - (map #(column-spec tables table-name %)) + (map #(column-spec enums tables table-name %)) (into [:map]))))))))