use crate::patio::types::PatioDataLayout; pub(crate) enum PatioDataValue { Array { element_layout: PatioDataLayout, elements: Vec, }, Bool(bool), Byte(u8), DataPtr(PatioDataPtrValue), Int(PatioIntValue), Int32(PatioIntValue), Struct { elements: Vec, }, } impl PatioDataValue { pub(crate) fn layout(&self) -> PatioDataLayout { match self { PatioDataValue::Array { element_layout, elements, } => PatioDataLayout::array(element_layout.clone(), elements.len().try_into().unwrap()), PatioDataValue::Bool(_) => PatioDataLayout::Bool, PatioDataValue::Byte(_) => PatioDataLayout::Byte, PatioDataValue::DataPtr(_) => PatioDataLayout::DataPtr, PatioDataValue::Int(_) => PatioDataLayout::Int, PatioDataValue::Int32(_) => PatioDataLayout::Int32, PatioDataValue::Struct { elements } => { PatioDataLayout::struct_(elements.iter().map(|element| element.layout()).collect()) } } } } #[derive(Debug)] pub(crate) enum PatioDataPtrValue { DataElement { name: String }, Null, } #[derive(Debug)] pub(crate) enum PatioIntValue { ByteOffsetOf { layout: PatioDataLayout, element_offsets: Vec, }, ByteSizeOf { layout: PatioDataLayout, }, Literal { value: i32, }, }