Skip to main content

Crate state_store

Crate state_store 

Source
Expand description

Internal implementation detail of sonos-sdk. Not intended for direct use.

Generic State Management Library

A type-safe, generic state management library with change detection and blocking iteration patterns.

§Features

  • Type-safe Storage: Store and retrieve strongly-typed properties
  • Change Detection: Only emit events when values actually change
  • Watch Pattern: Register interest in specific properties
  • Blocking Iteration: Consume change events via blocking iterators
  • Generic Entity IDs: Use any hashable type as entity identifiers

§Quick Start

use state_store::{StateStore, Property};

// Define a property type
#[derive(Clone, PartialEq, Debug)]
struct Temperature(f32);

impl Property for Temperature {
    const KEY: &'static str = "temperature";
}

// Create a store with String entity IDs
let store = StateStore::<String>::new();

// Watch for temperature changes on sensor-1
store.watch("sensor-1".to_string(), Temperature::KEY);

// Set a value (will emit change event since watched)
store.set(&"sensor-1".to_string(), Temperature(72.5));

// Get current value
let temp = store.get::<Temperature>(&"sensor-1".to_string());
assert_eq!(temp, Some(Temperature(72.5)));

§Iteration Patterns

// Blocking iteration (waits for events)
for event in store.iter() {
    println!("{} changed on {:?}", event.property_key, event.entity_id);
}

// Non-blocking (processes available events)
for event in store.iter().try_iter() {
    println!("Event: {:?}", event);
}

// With timeout
use std::time::Duration;
if let Some(event) = store.iter().recv_timeout(Duration::from_secs(1)) {
    println!("Got event: {:?}", event);
}

§Architecture

StateStore<Id>
    │
    ├── entities: HashMap<Id, PropertyBag>
    │       │
    │       └── PropertyBag: HashMap<TypeId, Box<dyn Any>>
    │
    ├── watched: HashSet<(Id, property_key)>
    │
    └── event_channel: mpsc::channel<ChangeEvent<Id>>
            │
            └── ChangeIterator<Id>

Re-exports§

pub use event::ChangeEvent;
pub use iter::ChangeIterator;
pub use iter::TimeoutIter;
pub use iter::TryIter;
pub use property::Property;
pub use store::PropertyBag;
pub use store::StateStore;

Modules§

event
Change events for property updates
iter
Blocking iterator over property change events
prelude
Prelude for convenient imports
property
Property trait for typed, watchable state values
store
Type-erased property storage and state management