-
Notifications
You must be signed in to change notification settings - Fork 446
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: implement
To/FromJSON Empty
(#5421)
Resolve cases when the `To/FromJSON` type classes are used with `Empty`, e.g. in the following motivating example. ``` import Lean structure Foo (α : Type) where y : Option α deriving Lean.ToJson #eval Lean.toJson (⟨none⟩ : Foo Empty) -- fails ``` This is a follow-up to this PR #5415, as suggested by @eric-wieser. It expands on the original suggestion by also handling `FromJSON`. --------- Co-authored-by: Kyle Miller <[email protected]>
- Loading branch information
1 parent
4b47a10
commit a108644
Showing
2 changed files
with
59 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import Lean | ||
|
||
/-! | ||
# Validation of `Json Empty` instance | ||
This test serves a similar purpose to the `Repr Empty` test in `repr_empty.lean`. | ||
-/ | ||
|
||
structure Foo (α : Type) where | ||
y : Option α | ||
deriving Lean.ToJson, Lean.FromJson, Repr | ||
|
||
/-! First, two basic examples with α not-Empty -/ | ||
/-- info: {"y": 1} -/ | ||
#guard_msgs in | ||
#eval Lean.toJson (⟨some 1⟩ : Foo Nat) | ||
|
||
/-! Ensure we can parse the type back -/ | ||
/-- info: Except.ok { y := some 1 } -/ | ||
#guard_msgs in | ||
#eval Lean.fromJson? (α := Foo Nat) <| json% {"y": 1} | ||
|
||
/-- info: {"y": null} -/ | ||
#guard_msgs in | ||
#eval Lean.toJson (⟨none⟩ : Foo Nat) | ||
|
||
/-- info: Except.ok { y := none } -/ | ||
#guard_msgs in | ||
#eval Lean.fromJson? (α := Foo Nat) <| json% {"y": null} | ||
|
||
/-! Examples with the `Empty` type -/ | ||
/-- info: {"y": null} -/ | ||
#guard_msgs in | ||
#eval Lean.toJson (⟨none⟩ : Foo Empty) | ||
|
||
/-! Show that we can round-trip from string -/ | ||
/-- info: Except.ok { y := none } -/ | ||
#guard_msgs in | ||
#eval Lean.fromJson? (α := Foo Empty) <| json% {"y": null} | ||
|
||
/-! Show that parsing fails -/ | ||
/-- info: Except.error "type Empty has no constructor to match JSON value '\"Yo!\"'. | ||
This occurs when deserializing a value for type Empty, e.g. at type Option Empty with code | ||
for the 'some' constructor." -/ | ||
#guard_msgs in | ||
#eval Lean.fromJson? (α := Empty) <| json% "Yo!" | ||
|
||
/-! Show that parsing fails if we supply anything else but `null` -/ | ||
/-- info: Except.error "Foo.y: type Empty has no constructor to match JSON value '1'. | ||
This occurs when deserializing a value for type Empty, e.g. at type Option Empty with code | ||
for the 'some' constructor." -/ | ||
#guard_msgs in | ||
#eval Lean.fromJson? (α := Foo Empty) <| json% {"y": 1} |