vortex_layout/
session.rs

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