typeslot 0.2.0

Statically assigned slot indices for types, grouped by a marker type.
Documentation

Typeslot

License Crates.io Downloads Docs CI Discord

Assigns each type a unique usize index at startup, with optional group compartmentalization.

Usage

use typeslot::prelude::*;

// Define group markers.
struct ElementGroup;
struct ResourceGroup;

// Derive `TypeSlot` on your types.
#[derive(TypeSlot)]
#[slot(ElementGroup)]
struct Horizontal;

#[derive(TypeSlot)]
#[slot(ElementGroup)]
struct Vertical;

#[derive(TypeSlot)]
#[slot(ResourceGroup)]
struct Health;

// A type can belong to multiple groups.
#[derive(TypeSlot)]
#[slot(ElementGroup, ResourceGroup)]
struct Label;

// Call `init_slot` once per group before accessing slots.
// It returns the number of slots assigned in the group.
let element_count = init_slot::<ElementGroup>();
let resource_count = init_slot::<ResourceGroup>();

assert_eq!(element_count, 3); // Horizontal, Vertical, Label
assert_eq!(resource_count, 2); // Health, Label

// Use SlotGroup for ergonomic access without repeating the group type.
let elements = SlotGroup::<ElementGroup>::new();
let resources = SlotGroup::<ResourceGroup>::new();

println!("{}", elements.get::<Horizontal>());
println!("{}", resources.get::<Health>());

// Or use the free functions directly.
println!("{}", slot::<Horizontal, ElementGroup>());
println!("{}", slot::<Health, ResourceGroup>());

Join the community!

You can join us on the Voxell discord server.

License

typeslot is dual-licensed under either:

This means you can select the license you prefer! This dual-licensing approach is the de-facto standard in the Rust ecosystem and there are very good reasons to include both.