roussillon_type_system/value/
sequence.rs1use std::cell::RefCell;
2use std::fmt::Debug;
3use std::rc::Rc;
4use crate::parse::{parse_slice, Parsed};
5
6use crate::types::concept::{DataType, Type};
7use crate::types::sequence::Tuple;
8use crate::value::concept::{DataValue, ValueCell};
9use crate::value::error::{SequenceError, TypeResult};
10
11#[derive(Clone, Debug)]
12pub struct Sequence {
13 definition: Tuple,
14 values: Vec<ValueCell>,
15}
16
17impl Sequence {
18
19 pub fn empty() -> Self {
20 Self {
21 definition: vec![],
22 values: vec![],
23 }
24 }
25
26 pub fn new(definition: Tuple, values: &[ValueCell]) -> TypeResult<Self> {
27 if definition.len() != values.len() {
28 return Err(SequenceError::SequenceLengthMismatch { expected: 0, provided: 0 }.promote());
29 }
30 for (index, expected) in definition.iter().enumerate() {
31 values[index].borrow().validate_type(expected)?;
32 }
33 Ok(Self { definition, values: values.to_vec() })
34 }
35
36 pub fn values(&self) -> &[ValueCell] {
37 &self.values
38 }
39
40 pub fn get(&self) -> Vec<ValueCell> {
41 self.values().to_vec()
42 }
43 pub fn to_cell(self) -> ValueCell { Rc::new(RefCell::new(self)) }
44
45 pub fn from(definition: Tuple, raw: &[u8]) -> TypeResult<Self> {
46 let mut values = Vec::new();
47 let mut start = 0;
48 let mut end = 0;
49 for t in definition.iter() {
50 end += t.size();
51 values.push(t.construct_from_raw(&raw[start..end])?);
52 start = end;
53 }
54 Self::new(definition.clone(), &values)
55 }
56
57 pub fn parse(input: &[u8], definition: Tuple) -> Parsed<Self> {
63 let (Some(raw), rest) = parse_slice(input, definition.size()) else { return (None, input); };
64 (Some(Self::from(definition, raw).unwrap()), rest)
65 }
66}
67
68pub fn values_to_raw(values: &[ValueCell]) -> Vec<u8> {
69 let mut raw = Vec::new();
70 for element in values {
71 raw.extend(element.borrow().raw());
72 }
73 raw
74}
75
76impl DataValue for Sequence {
77 fn data_type(&self) -> Type {
78 Rc::new(self.definition.clone())
79 }
80
81 fn raw(&self) -> Vec<u8> { values_to_raw(&self.values) }
82
83 fn set(&mut self, raw: &[u8]) {
84 let mut pointer: usize = 0;
85 for i in self.values.iter_mut() {
86 let pointer_end = pointer + i.borrow().data_type().size();
87 i.borrow_mut().set(&raw[pointer..pointer_end]);
88 pointer = pointer_end;
89 }
90 }
91}