(De-)Serializing Garble Values

If the optional "serde" crate feature is enabled, Garble supports serializing literal values to/from formats supported via serde. The following ABNF grammar shows how Garble literals are represented in JSON (using serde_json):

literal = "\"True\"" /
          "\"False\"" /
          "{\"NumUnsigned\":[" uint "," uint-ty "]}" /
          "{\"NumSigned\":[" int "," int-ty "]}" /
          "{\"ArrayRepeat\":[" literal "," uint "]}" /
          "{\"Array\":[" [literal *("," literal)] "]}" /
          "{\"Tuple\":[" [literal *("," literal)] "]}" /
          "{\"Enum\":[\"" string "\",\"" string "\"," variant "]}" /
          "{\"Range\":[" uint "," uint "," uint-type "]}"

uint    = 1*DIGIT

uint-ty = "\"Usize\"" /
          "\"U8\"" /
          "\"U16\"" /
          "\"U32\"" /
          "\"U64\"" /
          "\"Unspecified\""

int     = ["-"] uint

int-ty  = "\"I8\"" /
          "\"I16\"" /
          "\"I32\"" /
          "\"I64\"" /
          "\"Unspecified\""

string  = 1*ALPHA

variant = "\"Unit\"" /
          "{\"Tuple\":[" [literal *("," literal)] "]}"

Here are some example Garble literals and how they would be serialized as JSON:

Garble LiteralSerialized as JSON
true"True"
200u32{"NumUnsigned":[200,"U32"]}
-200{"NumSigned":[-200,"Unspecified"]}
[true; 3]{"ArrayRepeat":["True",3]}
[true, false]{"Array":["True","False"]}
(true, false, 10){"Tuple":["True","False",{"NumUnsigned":[10,"U8"]}]}
FooBar {foo: true, bar: false}{"Struct":["FooBar",[["foo","True"],["bar","False"]]]}
FooBar::Foo{"Enum":["FooBar","Foo","Unit"]}
FooBar::Bar(true, false){"Enum":["FooBar","Bar",{"Tuple":["True","False"]}]}
2u8..10u8{"Range":[2,10,"U8"]}