Crate resman[−][src]
Runtime managed resource borrowing.
This library provides a map that can store one of any type, as well as mutable borrows to each type at the same time.
Note: This implementation is extracted from shred
, with the
following differences:
- Uses
downcast-rs
instead ofmopa
for downcasting types. - Adds
Debug
andPartialEq
implementations for borrow types when the resource type implements those traits. - Returns
None
instead of panicking fortry_borrow*
functions when the resource is already borrowed.
Usage
Add the following to Cargo.toml
resman = "0.1.0"
In code:
use resman::Resources; struct A(u32); struct B(u32); let mut resources = Resources::default(); resources.insert(A(1)); resources.insert(B(2)); // We can validly have two mutable borrows from the `Resources` map! let mut a = resources.borrow_mut::<A>(); let mut b = resources.borrow_mut::<B>(); a.0 = 2; b.0 = 3; // We need to explicitly drop the A and B borrows, because they are runtime // managed borrows, and rustc doesn't know to drop them before the immutable // borrows after this. drop(a); drop(b); // Multiple immutable borrows to the same resource are valid. let a_0 = resources.borrow::<A>(); let _a_1 = resources.borrow::<A>(); let b = resources.borrow::<B>(); println!("A: {}", a_0.0); println!("B: {}", b.0); // Trying to mutably borrow a resource that is already borrowed (immutably // or mutably) returns `None`. let a_try_borrow_mut = resources.try_borrow_mut::<A>(); let exists = if a_try_borrow_mut.is_some() { "Some(..)" } else { "None" }; println!("a_try_borrow_mut: {}", exists); // prints "None"
See Also
Structs
Cell | A custom cell container that is a |
CellRef | An immutable reference to data in a |
CellRefMut | A mutable reference to data in a |
Entry | |
Ref | |
RefMut | |
Resources | Map from |
Traits
Resource | Trait to represent any type that is |