Crate structype_derive[][src]

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);
}

Derive Macros

StrucType