irox_types/
schema.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2025 IROX Contributors
3//
4
5use 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}