-
Notifications
You must be signed in to change notification settings - Fork 786
/
tagged_literals.cljc
93 lines (83 loc) · 2.93 KB
/
tagged_literals.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
;; Copyright (c) Rich Hickey. All rights reserved.
;; The use and distribution terms for this software are covered by the
;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
;; which can be found in the file epl-v10.html at the root of this distribution.
;; By using this software in any fashion, you are agreeing to be bound by
;; the terms of this license.
;; You must not remove this notice, or any other, from this software.
(ns cljs.tagged-literals
#?(:clj (:require [clojure.instant :as inst])
:cljs (:require [cljs.reader :as reader])))
(defn read-queue
[form]
(when-not (vector? form)
(throw
#?(:clj (RuntimeException.
"Queue literal expects a vector for its elements.")
:cljs (js/Error.
"Queue literal expects a vector for its elements."))))
(list 'cljs.core/into 'cljs.core.PersistentQueue.EMPTY form))
#?(:clj
(defn read-uuid
[form]
(when-not (string? form)
(throw (RuntimeException. "UUID literal expects a string as its representation.")))
(try
(java.util.UUID/fromString form)
(catch Throwable e
(throw (RuntimeException. (.getMessage e)))))))
#?(:cljs
(defn read-uuid
[form]
(when-not (string? form)
(throw (js/Error. "UUID literal expects a string as its representation.")))
(try
(uuid form)
(catch :default e
(throw (js/Error. (. e -message)))))))
#?(:clj
(defn read-inst
[form]
(when-not (string? form)
(throw (RuntimeException. "Instance literal expects a string for its timestamp.")))
(try
(inst/read-instant-date form)
(catch Throwable e
(throw (RuntimeException. (.getMessage e)))))))
#?(:cljs
(defn read-inst
[form]
(when-not (string? form)
(throw (js/Error. "Instance literal expects a string for its timestamp.")))
(try
(#'reader/read-date form)
(catch :default e
(throw (js/Error. (. e -message)))))))
(defn valid-js-literal-key? [k]
(or (string? k)
(and (keyword? k)
(nil? (namespace k)))))
(deftype JSValue [val])
(defn read-js
[form]
(when-not (or (vector? form) (map? form))
(throw
#?(:clj (RuntimeException.
"JavaScript literal must use map or vector notation")
:cljs (js/Error.
"JavaScript literal must use map or vector notation"))))
(when-not (or (not (map? form))
(every? valid-js-literal-key? (keys form)))
(throw
#?(:clj (RuntimeException.
"JavaScript literal keys must be strings or unqualified keywords")
:cljs (js/Error.
"JavaScript literal keys must be strings or unqualified keywords"))))
(JSValue. form))
(def ^:dynamic *cljs-data-readers*
(merge ;; assumes we can read all data_readers
#?(:clj *data-readers*)
{'queue read-queue
'uuid read-uuid
'inst read-inst
'js read-js}))