diff options
| author | Glenn Smith <glenn@vector35.com> | 2023-08-17 02:32:02 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2023-08-17 02:32:02 -0400 |
| commit | 9661676288204029807100440573815970167747 (patch) | |
| tree | 1f00a665b459e80b8b4198a24c7324267c26e1f8 | |
| parent | 4382980131096754098548630805693482646547 (diff) | |
Rust API: Add Structure::base_structures and fix type on StructureBuilder::base_structures
Now Result<Vec<BaseStructure>> since it could technically return nullptr if you have invalid usage... Probably not possible but the other functions in Structure do similar so this is for consistency.
| -rw-r--r-- | rust/src/types.rs | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/rust/src/types.rs b/rust/src/types.rs index 1eabcb4b..59fe7667 100644 --- a/rust/src/types.rs +++ b/rust/src/types.rs @@ -1824,21 +1824,25 @@ impl StructureBuilder { unsafe { BNStructureBuilderPropagatesDataVariableReferences(self.handle) } } - pub fn base_structures(&self) -> Vec<BaseStructure> { + pub fn base_structures(&self) -> Result<Vec<BaseStructure>> { let mut count = 0usize; let bases = unsafe { BNGetBaseStructuresForStructureBuilder(self.handle, &mut count) }; - let bases_slice = unsafe { slice::from_raw_parts_mut(bases, count) }; + if bases.is_null() { + Err(()) + } else { + let bases_slice = unsafe { slice::from_raw_parts_mut(bases, count) }; - let result = bases_slice - .iter() - .map(|base| unsafe { BaseStructure::from_raw(*base) }) - .collect::<Vec<_>>(); + let result = bases_slice + .iter() + .map(|base| unsafe { BaseStructure::from_raw(*base) }) + .collect::<Vec<_>>(); - unsafe { - BNFreeBaseStructureList(bases, count); - } + unsafe { + BNFreeBaseStructureList(bases, count); + } - result + Ok(result) + } } // TODO : The other methods in the python version (type, members, remove, replace, etc) @@ -1929,6 +1933,27 @@ impl Structure { } } + pub fn base_structures(&self) -> Result<Vec<BaseStructure>> { + let mut count = 0usize; + let bases = unsafe { BNGetBaseStructuresForStructure(self.handle, &mut count) }; + if bases.is_null() { + Err(()) + } else { + let bases_slice = unsafe { slice::from_raw_parts_mut(bases, count) }; + + let result = bases_slice + .iter() + .map(|base| unsafe { BaseStructure::from_raw(*base) }) + .collect::<Vec<_>>(); + + unsafe { + BNFreeBaseStructureList(bases, count); + } + + Ok(result) + } + } + // TODO : The other methods in the python version (alignment, packed, type, members, remove, replace, etc) } |
