WebAssembly / component-model

Repository for design and specification of the Component Model
Other
897 stars 75 forks source link

How to define the json object #335

Open oovm opened 2 months ago

oovm commented 2 months ago

I want to define a json structure to provide serialization and deserialization capabilities, but I encountered two problems.

  1. No mapping of dictionary type
  2. Unable to define recursive types (direct or indirect)

package endec: json@0.1.0;

world imports {
    export types;
}

interface types {
    /// The json value context
    record json {
        /// The root value
        root: value
    }
    /// A json value
    variant value {
        %null,
        %bool(bool),
        %decimal(f64),
        %string(string),
        %array(array),
        %object(object)
    }
    /// A json array
    record array {
        %list: list<value>,
    }
    /// A json object
    record object {
        %dict: list<tuple<string, value>>,
    }
}

Such a definition will report an error:

called `Result::unwrap()` on an `Err` value: failed to parse package: C:\Users\CLionProjects\serde-wasi\projects\serde-json\wit

Caused by:
    type `value` depends on itself
         --> C:\Users\CLionProjects\serde-wasi\projects\serde-json\wit\world.wit:11:15
          |
       11 |         root: value
          |               ^----
lukewagner commented 2 months ago

Currently value types are not allowed to be recursive, which is the root problem here. It's definitely valuable and tracked as a future feature in #56, it's just a ton of effort and complexity so we were planning to postpone it until after the 1.0/MVP. Until then, the best approximation is to define JSON via resource types (which admittedly isn't very efficient due to the function call overhead, so you might also just want to pass JSON as a string or BSON list<u8>).