Skip to content

Commit 509bdbf

Browse files
committed
[Rust] Refactor AnalysisProgress returned from BinaryViewExt::analysis_progress
1 parent 0c9e976 commit 509bdbf

File tree

2 files changed

+59
-14
lines changed

2 files changed

+59
-14
lines changed

rust/src/binary_view.rs

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ use crate::variable::DataVariable;
6262
use crate::{Endianness, BN_FULL_CONFIDENCE};
6363
use std::collections::HashMap;
6464
use std::ffi::{c_char, c_void, CString};
65+
use std::fmt::{Display, Formatter};
6566
use std::ops::Range;
6667
use std::path::Path;
6768
use std::ptr::NonNull;
@@ -187,11 +188,57 @@ pub struct AnalysisInfo {
187188
pub active_info: Vec<ActiveAnalysisInfo>,
188189
}
189190

190-
#[derive(Debug, Clone)]
191-
pub struct AnalysisProgress {
192-
pub state: AnalysisState,
193-
pub count: usize,
194-
pub total: usize,
191+
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq)]
192+
pub enum AnalysisProgress {
193+
Initial,
194+
Hold,
195+
Idle,
196+
Discovery,
197+
Disassembling(usize, usize),
198+
Analyzing(usize, usize),
199+
ExtendedAnalysis,
200+
}
201+
202+
impl Display for AnalysisProgress {
203+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
204+
match self {
205+
AnalysisProgress::Initial => {
206+
write!(f, "Initial")
207+
}
208+
AnalysisProgress::Hold => {
209+
write!(f, "Hold")
210+
}
211+
AnalysisProgress::Idle => {
212+
write!(f, "Idle")
213+
}
214+
AnalysisProgress::Discovery => {
215+
write!(f, "Discovery")
216+
}
217+
AnalysisProgress::Disassembling(count, total) => {
218+
write!(f, "Disassembling ({count}/{total})")
219+
}
220+
AnalysisProgress::Analyzing(count, total) => {
221+
write!(f, "Analyzing ({count}/{total})")
222+
}
223+
AnalysisProgress::ExtendedAnalysis => {
224+
write!(f, "Extended Analysis")
225+
}
226+
}
227+
}
228+
}
229+
230+
impl From<BNAnalysisProgress> for AnalysisProgress {
231+
fn from(value: BNAnalysisProgress) -> Self {
232+
match value.state {
233+
BNAnalysisState::InitialState => Self::Initial,
234+
BNAnalysisState::HoldState => Self::Hold,
235+
BNAnalysisState::IdleState => Self::Idle,
236+
BNAnalysisState::DiscoveryState => Self::Discovery,
237+
BNAnalysisState::DisassembleState => Self::Disassembling(value.count, value.total),
238+
BNAnalysisState::AnalyzeState => Self::Analyzing(value.count, value.total),
239+
BNAnalysisState::ExtendedAnalyzeState => Self::ExtendedAnalysis,
240+
}
241+
}
195242
}
196243

197244
pub trait BinaryViewExt: BinaryViewBase {
@@ -604,12 +651,8 @@ pub trait BinaryViewExt: BinaryViewBase {
604651
}
605652

606653
fn analysis_progress(&self) -> AnalysisProgress {
607-
let progress = unsafe { BNGetAnalysisProgress(self.as_ref().handle) };
608-
AnalysisProgress {
609-
state: progress.state,
610-
count: progress.count,
611-
total: progress.total,
612-
}
654+
let progress_raw = unsafe { BNGetAnalysisProgress(self.as_ref().handle) };
655+
AnalysisProgress::from(progress_raw)
613656
}
614657

615658
fn default_arch(&self) -> Option<CoreArchitecture> {

rust/tests/binary_view.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use binaryninja::binary_view::search::SearchQuery;
2-
use binaryninja::binary_view::{AnalysisState, BinaryViewBase, BinaryViewExt, StringType};
2+
use binaryninja::binary_view::{
3+
AnalysisProgress, AnalysisState, BinaryViewBase, BinaryViewExt, StringType,
4+
};
35
use binaryninja::data_buffer::DataBuffer;
46
use binaryninja::function::{Function, FunctionViewType};
57
use binaryninja::headless::Session;
@@ -16,7 +18,7 @@ fn test_binary_loading() {
1618
let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
1719
let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
1820
assert!(view.has_initial_analysis(), "No initial analysis");
19-
assert_eq!(view.analysis_progress().state, AnalysisState::IdleState);
21+
assert_eq!(view.analysis_progress(), AnalysisProgress::Idle);
2022
assert_eq!(view.file().is_analysis_changed(), false);
2123
assert_eq!(view.file().is_database_backed(), false);
2224
}
@@ -188,7 +190,7 @@ fn test_deterministic_functions() {
188190
for file_name in TARGET_FILES {
189191
let path = out_dir.join(file_name);
190192
let view = session.load(&path).expect("Failed to load view");
191-
assert_eq!(view.analysis_progress().state, AnalysisState::IdleState);
193+
assert_eq!(view.analysis_progress(), AnalysisProgress::Idle);
192194
let functions: BTreeMap<u64, FunctionSnapshot> = view
193195
.functions()
194196
.iter()

0 commit comments

Comments
 (0)