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 /rust/src | |
| 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.
Diffstat (limited to 'rust/src')
| -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) } |
