1use std::any::Any;
5
6use vortex_session::Ref;
7use vortex_session::SessionExt;
8use vortex_session::SessionVar;
9use vortex_session::registry::Registry;
10
11use crate::LayoutEncodingRef;
12use crate::layouts::chunked::ChunkedLayoutEncoding;
13use crate::layouts::dict::DictLayoutEncoding;
14use crate::layouts::flat::FlatLayoutEncoding;
15use crate::layouts::struct_::StructLayoutEncoding;
16use crate::layouts::zoned::ZonedLayoutEncoding;
17
18pub type LayoutRegistry = Registry<LayoutEncodingRef>;
19
20#[derive(Debug)]
22pub struct LayoutSession {
23 registry: LayoutRegistry,
24}
25
26impl LayoutSession {
27 pub fn register(&self, layout: LayoutEncodingRef) {
29 self.registry.register(layout.id(), layout);
30 }
31
32 pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
34 for layout in layouts {
35 self.registry.register(layout.id(), layout);
36 }
37 }
38
39 pub fn registry(&self) -> &LayoutRegistry {
41 &self.registry
42 }
43}
44
45impl Default for LayoutSession {
46 fn default() -> Self {
47 let layouts = LayoutRegistry::default();
48
49 layouts.register(ChunkedLayoutEncoding.id(), ChunkedLayoutEncoding.as_ref());
51 layouts.register(FlatLayoutEncoding.id(), FlatLayoutEncoding.as_ref());
52 layouts.register(StructLayoutEncoding.id(), StructLayoutEncoding.as_ref());
53 layouts.register(ZonedLayoutEncoding.id(), ZonedLayoutEncoding.as_ref());
54 layouts.register(DictLayoutEncoding.id(), DictLayoutEncoding.as_ref());
55
56 Self { registry: layouts }
57 }
58}
59
60impl SessionVar for LayoutSession {
61 fn as_any(&self) -> &dyn Any {
62 self
63 }
64 fn as_any_mut(&mut self) -> &mut dyn Any {
65 self
66 }
67}
68
69pub trait LayoutSessionExt: SessionExt {
71 fn layouts(&self) -> Ref<'_, LayoutSession> {
73 self.get::<LayoutSession>()
74 }
75}
76impl<S: SessionExt> LayoutSessionExt for S {}