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;