Retrieval
Each registered object needs to be retrieved with the same lifetime that it was registered with.
For retrieval, the following functions are available on the [Registry
]:
The generic type parameter T
is necessary to be specified, either on the
function call or the assignee. It's necessary to find which object to
construct.
This is the example from the previous section:
#![allow(unused)] extern crate ferrunix; use ferrunix::{Transient, Registry}; pub struct CurrentCurrency(&'static str); pub struct Config { currency: CurrentCurrency } fn main() { let registry = Registry::empty(); registry.transient(|| CurrentCurrency("USD")); registry .with_deps::<_, (Transient<CurrentCurrency>,)>() // Trailing comma required! .transient(|(currency,)| { Config { currency: currency.get(), } }); // Construct a new config and currency. let config = registry.get_transient::<Config>().unwrap(); // <-- (1) let currency: CurrentCurrency = registry.get_transient().unwrap(); // <-- (2) // Assert that our retrieved object is actually what we expect. assert_eq!(config.currency.0, "USD"); assert_eq!(currency.0, "USD"); }
At (1)
the Registry::get_transient::<T>()
function is used to construct a
new Config
. The generic type parameter T
is directly specified at the
function call.
However, at (2)
, the Rust compiler can infer the type T
from the annotation
on the left, and therefore, it's not necessary to explicitly specify it.