From 8bdec6692770ba57dfb4394a31fad4963cc3976a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 7 May 2025 11:38:52 +0200 Subject: [PATCH] :sparkles: Remove the ILazySchema internal abstraction from schema ns --- common/src/app/common/schema.cljc | 156 +++++++++--------------------- 1 file changed, 47 insertions(+), 109 deletions(-) diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index 557dc8b3d7..b9f6629835 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -28,10 +28,6 @@ [malli.transform :as mt] [malli.util :as mu])) -(defprotocol ILazySchema - (-validate [_ o]) - (-explain [_ o])) - (def default-options {:registry sr/default-registry}) @@ -51,10 +47,6 @@ [s] (m/type-properties s)) -(defn- lazy-schema? - [s] - (satisfies? ILazySchema s)) - (defn schema [s] (if (schema? s) @@ -111,12 +103,16 @@ (malli.error/error-value exp {:malli.error/mask-valid-values '...})) (defn optional-keys - [schema] - (mu/optional-keys schema default-options)) + ([schema] + (mu/optional-keys schema nil default-options)) + ([schema keys] + (mu/optional-keys schema keys default-options))) (defn required-keys - [schema] - (mu/required-keys schema default-options)) + ([schema] + (mu/required-keys schema nil default-options)) + ([schema keys] + (mu/required-keys schema keys default-options))) (defn transformer [& transformers] @@ -229,6 +225,11 @@ (let [vfn (delay (decoder (if (delay? s) (deref s) s) transformer))] (fn [v] (@vfn v)))) +(defn decode-fn + [s transformer] + (let [vfn (delay (decoder (if (delay? s) (deref s) s) transformer))] + (fn [v] (@vfn v)))) + (defn humanize-explain "Returns a string representation of the explain data structure" [{:keys [errors value]} & {:keys [length level]}] @@ -274,38 +275,36 @@ ([s] (lookup sr/default-registry s)) ([registry s] (schema (mr/schema registry s)))) -(defn- fast-check - "A fast path for checking process, assumes the ILazySchema protocol - implemented on the provided `s` schema. Sould not be used directly." - [s type code hint value] - (when-not ^boolean (-validate s value) - (let [explain (-explain s value)] - (throw (ex-info hint {:type type - :code code - :hint hint - ::explain explain})))) - value) - -(declare ^:private lazy-schema) - (defn check-fn "Create a predefined check function" [s & {:keys [hint type code]}] - (let [schema (if (lazy-schema? s) s (lazy-schema s)) - hint (or ^boolean hint "check error") - type (or ^boolean type :assertion) - code (or ^boolean code :data-validation)] - (partial fast-check schema type code hint))) + (let [s (schema s) + validator* (delay (m/validator s)) + explainer* (delay (m/explainer s)) + hint (or ^boolean hint "check error") + type (or ^boolean type :assertion) + code (or ^boolean code :data-validation)] + + (fn [value] + (let [validate-fn @validator*] + (when-not ^boolean (validate-fn value) + (let [explain-fn @explainer* + explain (explain-fn value)] + (throw (ex-info hint {:type type + :code code + :hint hint + ::explain explain})))) + value)))) (defn check "A helper intended to be used on assertions for validate/check the - schema over provided data. Raises an assertion exception." - [s value & {:keys [hint type code]}] - (let [s (if (lazy-schema? s) s (lazy-schema s)) - hint (or ^boolean hint "check error") - type (or ^boolean type :assertion) - code (or ^boolean code :data-validation)] - (fast-check s type code hint value))) + schema over provided data. Raises an assertion exception. + + Use only on non-performance sensitive code, because it creates the + check-fn instance all the time it is invoked." + [s value & {:as opts}] + (let [check-fn (check-fn s opts)] + (check-fn value))) (defn type-schema [& {:as params}] @@ -319,11 +318,14 @@ ([params] (cond (map? params) - (let [type (get params :type)] + (let [mdata (meta params) + type (or (get mdata ::id) + (get mdata ::type) + (get params :type))] (assert (qualified-keyword? type) "expected qualified keyword for `type`") (let [s (m/-simple-schema params)] (swap! sr/registry assoc type s) - nil)) + s)) (vector? params) (let [mdata (meta params) @@ -331,83 +333,19 @@ (get mdata ::type))] (assert (qualified-keyword? type) "expected qualified keyword to be on metadata") (swap! sr/registry assoc type params) - nil) + params) (m/into-schema? params) (let [type (m/-type params)] - (swap! sr/registry assoc type params)) + (swap! sr/registry assoc type params) + params) :else (throw (ex-info "Invalid Arguments" {})))) ([type params] - (let [s (if (map? params) - (cond - (= :set (:type params)) - (m/-collection-schema params) - - (= :vector (:type params)) - (m/-collection-schema params) - - :else - (m/-simple-schema params)) - params)] - - (swap! sr/registry assoc type s) - nil))) - -(defn- lazy-schema - "Create ans instance of ILazySchema" - [s] - (let [schema (schema s) - validator (delay (m/validator schema)) - explainer (delay (m/explainer schema))] - - (reify - m/AST - (-to-ast [_ options] (m/-to-ast schema options)) - - m/EntrySchema - (-entries [_] (m/-entries schema)) - (-entry-parser [_] (m/-entry-parser schema)) - - m/Cached - (-cache [_] (m/-cache schema)) - - m/LensSchema - (-keep [_] (m/-keep schema)) - (-get [_ key default] (m/-get schema key default)) - (-set [_ key value] (m/-set schema key value)) - - m/Schema - (-validator [_] - (m/-validator schema)) - (-explainer [_ path] - (m/-explainer schema path)) - (-parser [_] - (m/-parser schema)) - (-unparser [_] - (m/-unparser schema)) - (-transformer [_ transformer method options] - (m/-transformer schema transformer method options)) - (-walk [_ walker path options] - (m/-walk schema walker path options)) - (-properties [_] - (m/-properties schema)) - (-options [_] - (m/-options schema)) - (-children [_] - (m/-children schema)) - (-parent [_] - (m/-parent schema)) - (-form [_] - (m/-form schema)) - - ILazySchema - (-validate [_ o] - (@validator o)) - (-explain [_ o] - (@explainer o))))) + (swap! sr/registry assoc type params) + params)) ;; --- BUILTIN SCHEMAS