From b5779a3de9eab7cb10d9011a22dab5d286d87092 Mon Sep 17 00:00:00 2001 From: Dmitri Sotnikov Date: Sun, 5 Sep 2021 13:00:19 -0400 Subject: [PATCH 1/2] updated cuerdas to the latest version --- deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps.edn b/deps.edn index df1ac4f..c051cd8 100644 --- a/deps.edn +++ b/deps.edn @@ -1,4 +1,4 @@ -{:deps {funcool/cuerdas {:mvn/version "2.2.0"}} +{:deps {funcool/cuerdas {:mvn/version "2021.05.29-0"}} :paths ["src"] :aliases {:dev From 4e0243c7df6f3529107b5e379cb9940d61616877 Mon Sep 17 00:00:00 2001 From: "dmitri.sotnikov@gmail.com" Date: Wed, 8 Sep 2021 18:39:49 -0400 Subject: [PATCH 2/2] added missing helper functions --- src/struct/core.cljc | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/struct/core.cljc b/src/struct/core.cljc index 28b2df4..0ea5eef 100644 --- a/src/struct/core.cljc +++ b/src/struct/core.cljc @@ -4,6 +4,33 @@ ;; --- Impl details +(defn parse-number + "General purpose function for parse number like + string to number. It works with both integers + and floats." + [s] + (if (nil? s) + #?(:cljs js/NaN :clj Double/NaN) + (if (numeric? s) + (edn/read-string s) + #?(:cljs js/NaN :clj Double/NaN)))) + +(defn parse-int + "Return the number value in integer form." + [s] + (cond + (number? s) + (int s) + + (and (string? s) + (re-matches #"-?\d+(\.\d+)?" s)) + #?(:clj (.longValue (java.math.BigDecimal. ^String s)) + :cljs (js/parseInt s 10)) + + :else + #?(:clj Double/NaN + :cljs js/NaN))) + (def ^:private map' #?(:cljs cljs.core/map :clj clojure.core/map)) @@ -215,7 +242,7 @@ {:message "must be a number" :optional true :validate #(or (number? %) (and (string? %) (str/numeric? %))) - :coerce #(if (number? %) % (str/parse-number %))}) + :coerce #(if (number? %) % (parse-number %))}) (def integer {:message "must be a integer" @@ -227,7 +254,7 @@ {:message "must be a long" :optional true :validate #(or (number? %) (and (string? %) (str/numeric? %))) - :coerce #(if (number? %) (int %) (str/parse-int %))}) + :coerce #(if (number? %) (int %) (parse-int %))}) (def boolean {:message "must be a boolean"