use std::collections::HashMap;
use std::sync::Arc;
use parking_lot::Mutex;
use crate::error::Error;
use crate::stream::StreamInner;
use crate::util::id::StreamId;
#[derive(Default)]
pub(crate) struct StreamRegistry {
inner: Mutex<HashMap<StreamId, Arc<StreamInner>>>,
}
impl std::fmt::Debug for StreamRegistry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("StreamRegistry")
.field("len", &self.inner.lock().len())
.finish()
}
}
impl StreamRegistry {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn insert(&self, id: StreamId, stream: Arc<StreamInner>) -> Result<(), Error> {
let mut g = self.inner.lock();
if g.contains_key(&id) {
return Err(Error::Protocol("duplicate stream id"));
}
g.insert(id, stream);
Ok(())
}
pub(crate) fn get(&self, id: StreamId) -> Option<Arc<StreamInner>> {
self.inner.lock().get(&id).cloned()
}
pub(crate) fn remove(&self, id: StreamId) -> Option<Arc<StreamInner>> {
self.inner.lock().remove(&id)
}
pub(crate) fn len(&self) -> usize {
self.inner.lock().len()
}
pub(crate) fn drain(&self) -> Vec<Arc<StreamInner>> {
let mut g = self.inner.lock();
g.drain().map(|(_, v)| v).collect()
}
}