use vortex_session::Ref;
use vortex_session::SessionExt;
use vortex_session::registry::Registry;
use crate::LayoutEncodingRef;
use crate::layouts::chunked::ChunkedLayoutEncoding;
use crate::layouts::dict::DictLayoutEncoding;
use crate::layouts::flat::FlatLayoutEncoding;
use crate::layouts::struct_::StructLayoutEncoding;
use crate::layouts::zoned::ZonedLayoutEncoding;
pub type LayoutRegistry = Registry<LayoutEncodingRef>;
#[derive(Debug)]
pub struct LayoutSession {
registry: LayoutRegistry,
}
impl LayoutSession {
pub fn register(&self, layout: LayoutEncodingRef) {
self.registry.register(layout.id(), layout);
}
pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
for layout in layouts {
self.registry.register(layout.id(), layout);
}
}
pub fn registry(&self) -> &LayoutRegistry {
&self.registry
}
}
impl Default for LayoutSession {
fn default() -> Self {
let layouts = LayoutRegistry::default();
layouts.register(ChunkedLayoutEncoding.id(), ChunkedLayoutEncoding.as_ref());
layouts.register(FlatLayoutEncoding.id(), FlatLayoutEncoding.as_ref());
layouts.register(StructLayoutEncoding.id(), StructLayoutEncoding.as_ref());
layouts.register(ZonedLayoutEncoding.id(), ZonedLayoutEncoding.as_ref());
layouts.register(DictLayoutEncoding.id(), DictLayoutEncoding.as_ref());
Self { registry: layouts }
}
}
pub trait LayoutSessionExt: SessionExt {
fn layouts(&self) -> Ref<'_, LayoutSession> {
self.get::<LayoutSession>()
}
}
impl<S: SessionExt> LayoutSessionExt for S {}