Defining metadata types in rust
A key feature of the API is that metadata is specified on a per-table basis.
In other words, a type to be used as node metadata implements the tskit::metadata::NodeMetadata
trait.
Using the tskit
cargo feature derive
, we can use procedural macros to define metadata types.
Here, we define a metadata type for a mutation table:
#[derive(serde::Serialize, serde::Deserialize, tskit::metadata::MutationMetadata)]
#[serializer("serde_json")]
struct MutationMetadata {
effect_size: f64,
dominance: f64,
}
We require that you also manually specify the serde
derive macros because the metadata API
itself does not depend on serde
.
Rather, it expects raw bytes and serde
happens to be a good way to get them from your data types.
The derive macro also enforces some helpful behavior at compile time. You will get a compile-time error if you try to derive two different metadata types for the same rust type. The error is due to conflicting implementations for a supertrait.