#[derive(UniqueTypeId)]
{
// Attributes available to this derive:
#[UniqueTypeIdFile]
#[UniqueTypeIdType]
#[UniqueTypeIdStart]
}
Expand description
UniqueTypeId
§What does it do?
It simply implements a trait for the type where is only one method - id() -> TypeId which
returns a unique positive number. For id generation, the procedural macro reads the file called
“types.toml” and searches for the type name there. You may also specify another file name if
you want by using UniqueTypeIdFile attribute. Speaking more detailed:
- The procedural macro reads the attributes on a type.
- If there are no attributes, it uses
types.tomlfile name as types file name, otherwise uses specified one. - For each type the macro is used it tries to find the type name in the types file. If it can find it, it returns it’s id, otherwise it returns the available id. Reading tests helps in understanding this.
§Usage
- Add
unique-type-idas dependency in yourCargo.toml:
[dependencies]
unique-type-id = "1"- Create a struct or enum and use the trait:
ⓘ
#[test]
fn unique_simple() {
use unique_type_id::UniqueTypeId;
#[derive(UniqueTypeId)]
struct Test1;
#[derive(UniqueTypeId)]
struct Test2;
assert_eq!(Test1::id().0, 1u64);
assert_eq!(Test2::id().0, 2u64);
}This will generate a types file if it has not been created yet and put there ids, starting with
0, for each type which was not found there. This is how it looks when you have predefined set
of ids for your types:
ⓘ
#[test]
fn unique_different_file() {
use unique_type_id::UniqueTypeId;
#[derive(UniqueTypeId)]
#[UniqueTypeIdFile = "types2.toml"]
struct Test1;
#[derive(UniqueTypeId)]
#[UniqueTypeIdFile = "types2.toml"]
struct Test2;
assert_eq!(Test1::id().0, 115u64);
assert_eq!(Test2::id().0, 232u64);
}Here we set up ids for our types manually by creating the types2.toml file.
§Options
UniqueTypeIdFile- allows to specify the file name to write/read the IDs from.UniqueTypeIdType- allows to change the ID number type fromu64(the default) to the user-preferred one.UniqueTypeIdStart- allows to set the starting ID number for the type. Can be used if the type layout file is very well-known and guaranteed to avoid collisions.
§UniqueTypeIdFile
ⓘ
#[derive(UniqueTypeId)]
#[UniqueTypeIdFile = "types2.toml"]
struct Test1;§UniqueTypeIdType
ⓘ
#[derive(UniqueTypeId)]
#[UniqueTypeIdType = "i16"]
struct Test;§UniqueTypeIdStart
ⓘ
#[derive(UniqueTypeId)]
#[UniqueTypeIdStart = "23"]
struct Test;