Skip to main content

vortex_layout/
session.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_session::Ref;
5use vortex_session::SessionExt;
6use vortex_session::registry::Registry;
7
8use crate::LayoutEncodingRef;
9use crate::layouts::chunked::ChunkedLayoutEncoding;
10use crate::layouts::dict::DictLayoutEncoding;
11use crate::layouts::flat::FlatLayoutEncoding;
12use crate::layouts::struct_::StructLayoutEncoding;
13use crate::layouts::zoned::ZonedLayoutEncoding;
14
15pub type LayoutRegistry = Registry<LayoutEncodingRef>;
16
17/// Session state for layout encodings.
18#[derive(Debug)]
19pub struct LayoutSession {
20    registry: LayoutRegistry,
21}
22
23impl LayoutSession {
24    /// Register a layout encoding in the session, replacing any existing encoding with the same ID.
25    pub fn register(&self, layout: LayoutEncodingRef) {
26        self.registry.register(layout.id(), layout);
27    }
28
29    /// Register layout encodings in the session, replacing any existing encodings with the same IDs.
30    pub fn register_many(&self, layouts: impl IntoIterator<Item = LayoutEncodingRef>) {
31        for layout in layouts {
32            self.registry.register(layout.id(), layout);
33        }
34    }
35
36    /// Returns the layout encoding registry.
37    pub fn registry(&self) -> &LayoutRegistry {
38        &self.registry
39    }
40}
41
42impl Default for LayoutSession {
43    fn default() -> Self {
44        let layouts = LayoutRegistry::default();
45
46        // Register the built-in layout encodings.
47        layouts.register(ChunkedLayoutEncoding.id(), ChunkedLayoutEncoding.as_ref());
48        layouts.register(FlatLayoutEncoding.id(), FlatLayoutEncoding.as_ref());
49        layouts.register(StructLayoutEncoding.id(), StructLayoutEncoding.as_ref());
50        layouts.register(ZonedLayoutEncoding.id(), ZonedLayoutEncoding.as_ref());
51        layouts.register(DictLayoutEncoding.id(), DictLayoutEncoding.as_ref());
52
53        Self { registry: layouts }
54    }
55}
56
57/// Extension trait for accessing layout session data.
58pub trait LayoutSessionExt: SessionExt {
59    /// Returns the layout encoding registry.
60    fn layouts(&self) -> Ref<'_, LayoutSession> {
61        self.get::<LayoutSession>()
62    }
63}
64impl<S: SessionExt> LayoutSessionExt for S {}