@@ -137,10 +137,19 @@ instance : ToJson DataValue where
137137
138138instance KVMapToJson : ToJson KVMap where
139139 toJson (m : KVMap) : Json :=
140- Json.mkObj <| m.entries.map fun (k, v) => (k.toString, toJson v)
140+ -- Array of pairs: [ [ [ "Elab","async" ] , false ], ... ]
141+ Json.arr <| m.entries.toArray.map fun (k, v) =>
142+ Json.arr #[toJson k, toJson v]
141143
142144instance : ToJson Options where
143- toJson (opts : Options) : Json := KVMapToJson.toJson opts
145+ toJson (opts : Options) : Json :=
146+ -- `Options` does not expose its internal map, but it *does* provide a `ForIn`
147+ -- instance, so we can iterate over all (Name × DataValue) pairs.
148+ Id.run do
149+ let mut entries : Array Json := #[]
150+ for (k, v) in opts do
151+ entries := entries.push (Json.arr #[toJson k, toJson v])
152+ return Json.arr entries
144153
145154def arrStrToName (arr : Array String) : Name :=
146155 if arr.isEmpty then Name.anonymous
@@ -181,9 +190,12 @@ instance KVMapFromJson : FromJson KVMap where
181190 return (kName, vData)
182191 | _ => Except.error "Expected array of pairs for KVMap"
183192 Except.ok <| KVMap.mk entries.toList
184- | _ => Except.error "Expected JSON object for KVMap"
193+ | _ => Except.error "Expected JSON array for KVMap"
185194
186195instance : FromJson Options where
187- fromJson? (j : Json) : Except String Options := KVMapFromJson.fromJson? j
196+ fromJson? (j : Json) : Except String Options := do
197+ let kv ← KVMapFromJson.fromJson? j
198+ Except.ok <| kv.entries.foldl (init := Options.empty) fun opts (k, v) =>
199+ opts.insert k v
188200
189201end Lean.Elab
0 commit comments