10 | import Data.List.Quantifiers as LQ
11 | import Data.Vect.Quantifiers as VQ
12 | import Data.SortedMap
20 | interface ToJSON a where
21 | constructor MkToJSON
22 | toJSON : forall v . Encoder v => a -> v
25 | jpair : ToJSON a => Encoder v => String -> a -> (String,v)
26 | jpair s val = (s, toJSON val)
31 | export %deprecate %inline
32 | (.=) : ToJSON a => Encoder v => String -> a -> (String,v)
36 | encodeVia : (0 v : Type) -> Encoder v => ToJSON a => a -> String
37 | encodeVia v val = stringify $
toJSON {v} val
40 | encode : ToJSON a => a -> String
41 | encode = encodeVia JSON
49 | singleField : Encoder v => String -> v -> v
50 | singleField s x = object [(s,x)]
57 | twoElemArray : Encoder v => String -> v -> v
58 | twoElemArray s x = array [string s, x]
66 | {auto _ : Encoder v}
67 | -> (tagField, contentField, tag : String)
70 | taggedObject tf cf tag x = object [(tf, string tag), (cf, x)]
81 | ToJSON String where toJSON = string
84 | ToJSON Char where toJSON = string . singleton
87 | ToJSON Double where toJSON = double
90 | ToJSON Bits8 where toJSON = integer . cast
93 | ToJSON Bits16 where toJSON = integer . cast
96 | ToJSON Bits32 where toJSON = integer . cast
99 | ToJSON Bits64 where toJSON = integer . cast
102 | ToJSON Int8 where toJSON = integer . cast
105 | ToJSON Int16 where toJSON = integer . cast
108 | ToJSON Int32 where toJSON = integer . cast
111 | ToJSON Int64 where toJSON = integer . cast
114 | ToJSON Int where toJSON = integer . cast
117 | ToJSON Integer where toJSON = integer
120 | ToJSON Nat where toJSON = integer . cast
123 | ToJSON Bool where toJSON = boolean
126 | ToJSON a => ToJSON (Maybe a) where
127 | toJSON Nothing = null
128 | toJSON (Just a) = toJSON a
131 | ToJSON a => ToJSON (List a) where
132 | toJSON = array . map toJSON
135 | ToJSON a => ToJSON (SnocList a) where
136 | toJSON = toJSON . (<>> [])
139 | ToJSON a => ToJSON (List1 a) where
140 | toJSON = toJSON . forget
143 | ToJSON a => ToJSON (Vect n a) where
144 | toJSON = toJSON . toList
148 | toJSON () = array Nil
151 | ToJSON a => ToJSON b => ToJSON (Either a b) where
152 | toJSON (Left a) = object [jpair "Left" a]
153 | toJSON (Right b) = object [jpair "Right" b]
156 | ToJSON a => ToJSON b => ToJSON (a, b) where
157 | toJSON (x,y) = array [toJSON x, toJSON y]
160 | ToJSON a => ToJSON (SortedMap String a) where
161 | toJSON = object . map (\(key, val) => (key, toJSON {v} val)) . SortedMap.toList
164 | (ps : LQ.All.All (ToJSON . f) ts) => ToJSON (All f ts) where
165 | toJSON = array . forget . zipPropertyWith (\_,v => toJSON v) ps
170 | (f : {0 x : a} -> p x -> q x -> r x)
174 | zipAllWith f [] [] = []
175 | zipAllWith f (px :: pxs) (qx :: qxs) = f px qx :: zipAllWith f pxs qxs
178 | (ps : VQ.All.All (ToJSON . f) ts) => ToJSON (VQ.All.All f ts) where
179 | toJSON = array . toList . forget . zipAllWith (\_,v => toJSON v) ps