Skip to content

Commit

Permalink
Use inlined functions for map/array encoding rather than functions
Browse files Browse the repository at this point in the history
  • Loading branch information
dakrone committed Feb 10, 2012
1 parent 02ee2ab commit 23f251b
Showing 1 changed file with 59 additions and 60 deletions.
119 changes: 59 additions & 60 deletions src/cheshire/generate.clj
@@ -1,6 +1,6 @@
(ns cheshire.generate
(:import (org.codehaus.jackson JsonGenerator)
(java.util List Date SimpleTimeZone UUID)
(java.util Date Map List Set SimpleTimeZone UUID)
(java.sql Timestamp)
(java.text SimpleDateFormat)
(java.math BigInteger)
Expand Down Expand Up @@ -38,63 +38,62 @@
Ratio (.writeNumber ~jg (double ~obj))
(fail ~obj)))))

(declare generate)

(definline generate-map [^JsonGenerator jg obj ^String date-format]
`(do
(.writeStartObject ~jg)
(doseq [[k# v#] ~obj]
(.writeFieldName ~jg (if (keyword? k#)
(name k#)
(str k#)))
(generate ~jg v# ~date-format))
(.writeEndObject ~jg)))

(definline generate-array [^JsonGenerator jg obj ^String date-format]
`(do
(.writeStartArray ~jg)
(doseq [item# ~obj]
(generate ~jg item# ~date-format))
(.writeEndArray ~jg)))

(defn generate [^JsonGenerator jg obj ^String date-format]
(let [generate-map (fn [^JsonGenerator jg m ^String date-format]
(do
(.writeStartObject jg)
(doseq [[k v] m
:let [field-name (if (keyword? k)
(name k)
(str k))]]
(.writeFieldName jg field-name)
(generate jg v date-format))
(.writeEndObject jg)))
generate-array (fn [^JsonGenerator jg a ^String date-format]
(do
(.writeStartArray jg)
(dotimes [i (count obj)]
(generate jg (.get ^List obj i) date-format))
(.writeEndArray jg)))]
(condp instance? obj
IPersistentCollection (condp instance? obj
clojure.lang.IPersistentMap
(generate-map jg obj date-format)
clojure.lang.IPersistentVector
(generate-array jg obj date-format)
clojure.lang.IPersistentSet
(generate jg (seq obj) date-format)
clojure.lang.ISeq
(do
(.writeStartArray jg)
(doseq [item obj]
(generate jg item date-format))
(.writeEndArray jg)))
java.util.Map (generate-map jg obj date-format)
java.util.List (generate-array jg obj date-format)
java.util.Set (generate jg (seq obj) date-format)
Number (number-dispatch ^JsonGenerator jg obj)
String (write-string ^JsonGenerator jg ^String obj)
Keyword (write-string ^JsonGenerator jg
(if-let [ns (namespace obj)]
(str ns "/" (name obj))
(name obj)))
UUID (write-string ^JsonGenerator jg (.toString ^UUID obj))
Symbol (write-string ^JsonGenerator jg (if-let [sym (resolve obj)]
(str (:ns (meta sym))
"/"
(:name (meta sym)))
(.toString ^Symbol obj)))
Boolean (.writeBoolean ^JsonGenerator jg ^Boolean obj)
Date (let [sdf (doto (SimpleDateFormat. date-format)
(.setTimeZone (SimpleTimeZone. 0 "UTC")))]
(write-string ^JsonGenerator jg (.format sdf obj)))
Timestamp (let [date (Date. (.getTime ^Timestamp obj))
sdf (doto (SimpleDateFormat. date-format)
(.setTimeZone (SimpleTimeZone. 0 "UTC")))]
(write-string ^JsonGenerator jg (.format sdf obj)))
(if (nil? obj)
(.writeNull ^JsonGenerator jg)
;; it must be a primative then
(try
(.writeNumber ^JsonGenerator jg obj)
(catch Exception e (fail obj)))))))
(condp instance? obj
IPersistentCollection (condp instance? obj
clojure.lang.IPersistentMap
(generate-map jg obj date-format)
clojure.lang.IPersistentVector
(generate-array jg obj date-format)
clojure.lang.IPersistentSet
(generate jg (seq obj) date-format)
clojure.lang.ISeq
(generate-array jg obj date-format))
Map (generate-map jg obj date-format)
List (generate-array jg obj date-format)
Set (generate jg (seq obj) date-format)
Number (number-dispatch ^JsonGenerator jg obj)
String (write-string ^JsonGenerator jg ^String obj)
Keyword (write-string ^JsonGenerator jg
(if-let [ns (namespace obj)]
(str ns "/" (name obj))
(name obj)))
UUID (write-string ^JsonGenerator jg (.toString ^UUID obj))
Symbol (write-string ^JsonGenerator jg (if-let [sym (resolve obj)]
(str (:ns (meta sym))
"/"
(:name (meta sym)))
(.toString ^Symbol obj)))
Boolean (.writeBoolean ^JsonGenerator jg ^Boolean obj)
Date (let [sdf (doto (SimpleDateFormat. date-format)
(.setTimeZone (SimpleTimeZone. 0 "UTC")))]
(write-string ^JsonGenerator jg (.format sdf obj)))
Timestamp (let [date (Date. (.getTime ^Timestamp obj))
sdf (doto (SimpleDateFormat. date-format)
(.setTimeZone (SimpleTimeZone. 0 "UTC")))]
(write-string ^JsonGenerator jg (.format sdf obj)))
(if (nil? obj)
(.writeNull ^JsonGenerator jg)
;; it must be a primative then
(try
(.writeNumber ^JsonGenerator jg obj)
(catch Exception e (fail obj))))))

0 comments on commit 23f251b

Please sign in to comment.