Expand description
Since Borsh is not a self-descriptive format we have a way to describe types serialized with Borsh so that
we can deserialize serialized blobs without having Rust types available. Additionally, this can be used to
serialize content provided in a different format, e.g. JSON object {"user": "alice", "message": "Message"}
can be serialized by JS code into Borsh format such that it can be deserialized into struct UserMessage {user: String, message: String}
on Rust side.
The important components are: BorshSchema
trait, Definition
and Declaration
types, and BorshSchemaContainer
struct.
BorshSchema
trait allows any type that implements it to be self-descriptive, i.e. generate it’s own schema;Declaration
is used to describe the type identifier, e.g.HashMap<u64, String>
;Definition
is used to describe the structure of the type;BorshSchemaContainer
is used to store all declarations and defintions that are needed to work with a single type.
Structs
All schema information needed to deserialize a single type.
Enums
The type that we use to represent the definition of the Borsh type.
The collection representing the fields of a struct.
Traits
The declaration and the definition of the type that can be used to (de)serialize Borsh without the Rust type that produced it.
Type Definitions
The type that we use to represent the declaration of the Borsh type.
The name of the field in the struct (can be used to convert JSON to Borsh using the schema).
The type that we use for the name of the variant.