(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"]}

Json-Schema

If you enable the json_schema feature (which also enables serde) the Literal type will implement the JsonSchema trait. This enables its inclusion in APIs documented using OpenAPI documentation generators like aide or the dropshot framework.