diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index d0dd2453c06c9f49d1cce7f935c3c0f092dba0ce..7a24b96535d8103cb1f74cf06665c8af8a27de4f 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -296,6 +296,12 @@ impl<'a> TypeInspector<'a> { let type_table = self.type_table.variant.as_union(); return UnionTypeInspector{ heap, type_table }; } + + pub fn as_struct(&'a self) -> StructTypeInspector<'a> { + let heap = self.heap.as_struct(); + let type_table = self.type_table.variant.as_struct(); + return StructTypeInspector{ heap, type_table }; + } } pub struct UnionTypeInspector<'a> { @@ -310,4 +316,18 @@ impl UnionTypeInspector<'_> { .position(|v| v.identifier.value.as_bytes() == variant_name)?; return Some(variant_index as i64); } +} + +pub struct StructTypeInspector<'a> { + heap: &'a StructDefinition, + type_table: &'a StructMonomorph, +} + +impl StructTypeInspector<'_> { + /// Retrieves struct field index + pub fn get_struct_field_index(&self, field_name: &[u8]) -> Option { + let field_index = self.heap.fields.iter() + .position(|v| v.field.value.as_bytes() == field_name)?; + return Some(field_index); + } } \ No newline at end of file