use std::any::Any;
use std::rc::Rc;
use super::id::TabId;
use super::info::TabInfo;
pub const STATIC_KIND: &str = "__static__";
#[derive(Clone)]
pub struct TabHandle {
pub id: TabId,
pub info: TabInfo,
pub kind: &'static str,
pub payload: Rc<dyn Any>,
}
impl std::fmt::Debug for TabHandle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("TabHandle")
.field("id", &self.id)
.field("kind", &self.kind)
.field("info", &self.info)
.field("payload_type", &(*self.payload).type_id())
.finish()
}
}
impl TabHandle {
pub fn dynamic<S: Any + 'static>(
id: TabId,
kind: &'static str,
info: TabInfo,
state: S,
) -> Self {
assert!(
kind != STATIC_KIND,
"tab kind '{}' is reserved for static tabs; pick a different identifier",
STATIC_KIND
);
Self {
id,
info,
kind,
payload: Rc::new(state),
}
}
pub fn dynamic_shared(
id: TabId,
kind: &'static str,
info: TabInfo,
payload: Rc<dyn Any>,
) -> Self {
assert!(
kind != STATIC_KIND,
"tab kind '{}' is reserved for static tabs; pick a different identifier",
STATIC_KIND
);
Self {
id,
info,
kind,
payload,
}
}
pub(crate) fn static_handle(id: TabId, info: TabInfo) -> Self {
Self {
id,
info,
kind: STATIC_KIND,
payload: Rc::new(()),
}
}
}