Expand description
This is a derive procedural macro that will let you add custom derive
and attributes over structs, enums and unions. This derive will add two impl on the
type. The as_string()
method returns a json serialized string representation of the type
with any meta information annotated with structype_meta("key"=val)
attribute,
while the print_fields()
method will print the same to STDOUT.
This macro will panic at compile time if annotated over tuple and unit structs.
§Example:
use structype_derive::StrucType;
#[derive(StrucType)]
// #[structype_meta("labelover_ride=name")] This will panic the macro
struct UserStruct {
#[structype_meta(override_name="Primary ID", order="1")]
id: i64,
#[structype_meta(override_name="name", order="0")]
username: String,
org: String,
details: Details,
}
#[derive(StrucType)]
struct Details {
user_attributes: std::collections::HashMap<String, String>,
}
fn print_struct_fields() {
UserStruct::print_fields();
let data = UserStruct::as_string();
println!("{}", data);
Details::print_fields();
let data = Details::as_string();
println!("{}", data);
}
The above will generate and return a json serialized string representation where the key is
the struct’s field name and the value is a HashMap<String, String>
of structype_meta
’s key-val. If the structype_meta
is
absent, the field’s associated value would be an empty {}
.
§Output:
[
{
"field_name": "id",
"meta": {
"order": "1",
"override_name": "Primary ID"
}
},
{
"field_name": "username",
"meta": {
"override_name": "name",
"order": "0"
}
},
{
"field_name": "org",
"meta": {}
},
{
"field_name": "details",
"meta": {}
}
]
If this serialized string needs to be deserialized into a struct, use the same type used here
§cargo.toml:
structype = "3.0.0"
§Example:
use structype::TypeMapVec;
use structype_derive::StrucType;
#[derive(StrucType)]
struct UserStruct {
#[structype_meta(override_name="Primary ID", order="1")]
id: i64,
}
fn print_struct_fields() {
UserStruct::print_fields();
let data: TypeMapVec = serde_json::from_str(&UserStruct::as_string()).unwrap();
println!("Deserialized: {:?}", data);
}