1use crate::NamedPrimitive;
6use alloc::collections::BTreeMap;
7use alloc::string::String;
8use alloc::string::ToString;
9use alloc::vec::Vec;
10
11#[derive(Debug, Clone)]
12pub struct PrimitiveSchema {
13 identifier: String,
14 variables: Vec<NamedPrimitive>,
15 size_bytes: usize,
16 varbl_offsets: BTreeMap<NamedPrimitive, usize>,
17}
18
19impl PrimitiveSchema {
20 pub fn new(identifier: String, variables: Vec<NamedPrimitive>) -> Self {
21 let mut size_bytes = 0;
22 let mut varbl_offsets = BTreeMap::<NamedPrimitive, usize>::default();
23 for varbl in &variables {
24 varbl_offsets.insert(varbl.clone(), size_bytes);
25 size_bytes += varbl.primitive().bytes_length();
26 }
27 PrimitiveSchema {
28 identifier,
29 variables,
30 size_bytes,
31 varbl_offsets,
32 }
33 }
34 pub fn get_identifier(&self) -> &str {
35 &self.identifier
36 }
37 pub fn get_variables(&self) -> &impl IntoIterator<Item = NamedPrimitive> {
38 &self.variables
39 }
40 pub fn get_offset(&self, varbl: &NamedPrimitive) -> Option<usize> {
41 self.varbl_offsets.get(varbl).copied()
42 }
43 pub fn size_bytes(&self) -> usize {
44 self.size_bytes
45 }
46}
47
48#[derive(Default, Debug, Clone)]
49pub struct PrimitiveSchemaBuilder {
50 identifier: Option<String>,
51 variables: Vec<NamedPrimitive>,
52}
53
54impl PrimitiveSchemaBuilder {
55 pub fn add(&mut self, varbl: NamedPrimitive) {
56 self.variables.push(varbl);
57 }
58 pub fn set_name(&mut self, name: &str) {
59 self.identifier = Some(name.to_string());
60 }
61 pub fn build(self) -> PrimitiveSchema {
62 PrimitiveSchema::new(self.identifier.unwrap_or_default(), self.variables)
63 }
64}