-
Notifications
You must be signed in to change notification settings - Fork 5
/
lancaster.cljc
135 lines (111 loc) · 4.47 KB
/
lancaster.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
(ns deercreeklabs.lancaster
(:require
[clojure.string :as str]
[deercreeklabs.baracus :as ba]
[deercreeklabs.lancaster.impl :as impl]
[deercreeklabs.lancaster.schemas :as schemas]
[deercreeklabs.lancaster.utils :as u]
[deercreeklabs.log-utils :as lu :refer [debugs]]
#?(:cljs [goog.math :as gm])
[schema.core :as s :include-macros true]
[taoensso.timbre :as timbre :refer [debugf errorf infof]])
#?(:cljs
(:require-macros deercreeklabs.lancaster)))
(declare make-name*)
#?(:cljs (def Long gm/Long))
(def int-schema (schemas/make-primitive-schema :int))
(def null-schema (schemas/make-primitive-schema :null))
(def boolean-schema (schemas/make-primitive-schema :boolean))
(def long-schema (schemas/make-primitive-schema :long))
(def float-schema (schemas/make-primitive-schema :float))
(def double-schema (schemas/make-primitive-schema :double))
(def bytes-schema (schemas/make-primitive-schema :bytes))
(def string-schema (schemas/make-primitive-schema :string))
(s/defn make-record-schema :- (s/protocol u/ILancasterSchema)
[name-kw :- s/Keyword
fields :- [schemas/RecordFieldDef]]
(schemas/make-schema :record name-kw fields))
(s/defn make-enum-schema :- (s/protocol u/ILancasterSchema)
[name-kw :- s/Keyword
symbols :- [s/Keyword]]
(schemas/make-schema :enum name-kw symbols))
(s/defn make-fixed-schema :- (s/protocol u/ILancasterSchema)
[name-kw :- s/Keyword
size :- s/Int]
(schemas/make-schema :fixed name-kw size))
(s/defn make-array-schema :- (s/protocol u/ILancasterSchema)
[items-schema :- (s/protocol u/ILancasterSchema)]
(schemas/make-schema :array nil items-schema))
(s/defn make-map-schema :- (s/protocol u/ILancasterSchema)
[values-schema :- (s/protocol u/ILancasterSchema)]
(schemas/make-schema :map nil values-schema))
(s/defn make-union-schema :- (s/protocol u/ILancasterSchema)
[members :- [(s/protocol u/ILancasterSchema)]]
(schemas/make-schema :union nil members))
(s/defn merge-record-schemas :- (s/protocol u/ILancasterSchema)
[name-kw :- s/Keyword
schemas :- [(s/protocol u/ILancasterSchema)]]
(schemas/merge-record-schemas name-kw schemas))
(s/defn maybe :- (s/protocol u/ILancasterSchema)
[schema :- (s/protocol u/ILancasterSchema)]
(make-union-schema [null-schema schema]))
(s/defn serialize :- ba/ByteArray
[schema-obj :- (s/protocol u/ILancasterSchema)
data :- s/Any]
;; TODO: Figure out how to set initial size better
(let [os (impl/make-output-stream 100)]
(u/serialize schema-obj os data)
(u/to-byte-array os)))
(s/defn deserialize :- s/Any
[reader-schema-obj :- (s/protocol u/ILancasterSchema)
writer-pcf :- s/Str
ba :- ba/ByteArray]
(let [is (impl/make-input-stream ba)]
(u/deserialize reader-schema-obj writer-pcf is)))
(s/defn wrap :- schemas/WrappedData
[schema :- (s/protocol u/ILancasterSchema)
data :- s/Any]
(u/wrap schema data))
(s/defn get-edn-schema :- s/Any
[schema :- (s/protocol u/ILancasterSchema)]
(u/get-edn-schema schema))
(s/defn get-json-schema :- s/Str
[schema :- (s/protocol u/ILancasterSchema)]
(u/get-json-schema schema))
(s/defn get-plumatic-schema :- s/Any
[schema :- (s/protocol u/ILancasterSchema)]
(u/get-plumatic-schema schema))
(s/defn get-parsing-canonical-form :- s/Str
[schema :- (s/protocol u/ILancasterSchema)]
(u/get-parsing-canonical-form schema))
(s/defn get-fingerprint64 :- Long
[schema :- (s/protocol u/ILancasterSchema)]
(u/get-fingerprint64 schema))
(s/defn schema? :- s/Bool
[arg :- s/Any]
(satisfies? u/ILancasterSchema arg))
;;;;;;;;;; Named Schema Helper Macros ;;;;;;;;;;;;;;;;
(defmacro def-record-schema
[clj-name & fields]
(let [ns-name (str (or
(:name (:ns &env)) ;; cljs
*ns*)) ;; clj
schema-name (u/make-schema-name clj-name)]
`(def ~clj-name
(schemas/make-schema :record ~ns-name ~schema-name (vector ~@fields)))))
(defmacro def-enum-schema
[clj-name & symbols]
(let [ns-name (str (or
(:name (:ns &env)) ;; cljs
*ns*)) ;; clj
schema-name (u/make-schema-name clj-name)]
`(def ~clj-name
(schemas/make-schema :enum ~ns-name ~schema-name (vector ~@symbols)))))
(defmacro def-fixed-schema
[clj-name size]
(let [ns-name (str (or
(:name (:ns &env)) ;; cljs
*ns*)) ;; clj
schema-name (u/make-schema-name clj-name)]
`(def ~clj-name
(schemas/make-schema :fixed ~ns-name ~schema-name ~size))))