Struct state::Storage[][src]

pub struct Storage<T> { /* fields omitted */ }
Expand description

A single storage location for global access to a value.

A Storage instance can hold a single value in a global context. A Storage instance begins without a value and must be initialized via the set method. Once a value has been set, it can be retrieved at any time and in any thread via the get method. The try_get can be used to determine whether the Storage has been initialized before attempting to retrieve the value.

For safety reasons, values stored in Storage must be Send + Sync + 'static.

Example

The following example uses Storage to hold a global instance of a HashMap which can be modified at will:

use std::collections::HashMap;
use std::sync::Mutex;
use std::thread;

use state::Storage;

static GLOBAL_MAP: Storage<Mutex<HashMap<String, String>>> = Storage::new();

fn run_program() {
    let mut map = GLOBAL_MAP.get().lock().unwrap();
    map.insert("another_key".into(), "another_value".into());
}

fn main() {
    // Create the initial map and store it in `GLOBAL_MAP`.
    let mut initial_map = HashMap::new();
    initial_map.insert("key".into(), "value".into());
    GLOBAL_MAP.set(Mutex::new(initial_map));

    // For illustration, we spawn a new thread that modified the map.
    thread::spawn(|| run_program()).join().expect("thread");

    // Assert that the modification took place.
    let map = GLOBAL_MAP.get().lock().unwrap();
    assert_eq!(map.get("another_key").unwrap(), "another_value");
}

Implementations

Create a new, uninitialized storage location.

Example

use state::Storage;

static MY_GLOBAL: Storage<String> = Storage::new();

Sets the value for this storage unit to value if it has not already been set before.

If a value has previously been set, self is unchanged and false is returned. Otherwise true is returned.

Example

static MY_GLOBAL: Storage<&'static str> = Storage::new();

assert_eq!(MY_GLOBAL.set("Hello, world!"), true);
assert_eq!(MY_GLOBAL.set("Goodbye, world!"), false);

Attempts to borrow the value in this storage location.

Returns Some if the state has previously been set. Otherwise returns None.

Example

static MY_GLOBAL: Storage<&'static str> = Storage::new();

assert_eq!(MY_GLOBAL.try_get(), None);

MY_GLOBAL.set("Hello, world!");

assert_eq!(MY_GLOBAL.try_get(), Some(&"Hello, world!"));

Borrows the value in this storage location.

Panics

Panics if a value has not previously been set. Use try_get for a non-panicking version.

Example

static MY_GLOBAL: Storage<&'static str> = Storage::new();

MY_GLOBAL.set("Hello, world!");
assert_eq!(*MY_GLOBAL.get(), "Hello, world!");

If the storage location has not yet been set, it is set to the return value of from. Returns a borrow to the value in this storage location.

Example

static MY_GLOBAL: Storage<&'static str> = Storage::new();

assert_eq!(*MY_GLOBAL.get_or_set(|| "Hello, world!"), "Hello, world!");

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

Performs the conversion.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.