reifydb_core/value/encoded/
named.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use std::ops::Deref;
5
6use reifydb_type::{Type, Value};
7
8use super::{EncodedValues, EncodedValuesLayout, EncodedValuesLayoutInner};
9
10/// An encoded named layout that includes field names
11#[derive(Debug, Clone)]
12pub struct EncodedValuesNamedLayout {
13	layout: EncodedValuesLayout,
14	names: Vec<String>,
15}
16
17impl EncodedValuesNamedLayout {
18	pub fn new(fields: impl IntoIterator<Item = (String, Type)>) -> Self {
19		let (names, types): (Vec<String>, Vec<Type>) =
20			fields.into_iter().map(|(name, r#type)| (name, r#type)).unzip();
21
22		let layout = EncodedValuesLayout::new(&types);
23
24		Self {
25			layout,
26			names,
27		}
28	}
29
30	pub fn get_name(&self, index: usize) -> Option<&str> {
31		self.names.get(index).map(|s| s.as_str())
32	}
33
34	pub fn names(&self) -> &[String] {
35		&self.names
36	}
37
38	pub fn get_value(&self, row: &EncodedValues, index: usize) -> Value {
39		self.layout.get_value(row, index)
40	}
41
42	pub fn layout(&self) -> &EncodedValuesLayout {
43		&self.layout
44	}
45
46	pub fn allocate_row(&self) -> EncodedValues {
47		self.layout.allocate()
48	}
49
50	pub fn set_values(&self, row: &mut EncodedValues, values: &[Value]) {
51		debug_assert_eq!(self.layout.fields.len(), values.len());
52		self.layout.set_values(row, values)
53	}
54}
55
56impl Deref for EncodedValuesNamedLayout {
57	type Target = EncodedValuesLayoutInner;
58
59	fn deref(&self) -> &Self::Target {
60		&self.layout
61	}
62}