summaryrefslogtreecommitdiff
path: root/rust/src/collaboration/sync.rs
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-05-07 19:22:21 -0400
committerMason Reed <35282038+emesare@users.noreply.github.com>2025-05-12 17:45:24 -0400
commit2f214f6c9935e8ce8df4732cde44a540a003258c (patch)
tree6fe319433ef0d2ad75fcc58a50eaa632bb627ec9 /rust/src/collaboration/sync.rs
parentb4cf0be8816182c9efca037e27e9439482f8bf36 (diff)
[Rust] Reduce usage of `IntoCStr` in function signatures
This is being done to reduce complexity in function signatures, specifically many of the strings we are passing ultimately should be new types themselves instead of "just strings", things such as type ids. Another place which was confusing was dealing with filesystem related APIs, this commit turns most of those params into a stricter `Path` type. This is bringing the rust api more inline with both python and C++, where the wrapper eagerly converts the string into the languages standard string type. Special consideration must be made for symbols or other possible non utf-8 objects. This commit will be followed up with one that adds the `IntoCStr` bound on API's we want to keep as invalid utf-8 so we can for example, get section by name on a section with invalid utf-8.
Diffstat (limited to 'rust/src/collaboration/sync.rs')
-rw-r--r--rust/src/collaboration/sync.rs64
1 files changed, 27 insertions, 37 deletions
diff --git a/rust/src/collaboration/sync.rs b/rust/src/collaboration/sync.rs
index b1b26982..a8006b8b 100644
--- a/rust/src/collaboration/sync.rs
+++ b/rust/src/collaboration/sync.rs
@@ -3,6 +3,7 @@ use super::{
};
use binaryninjacore_sys::*;
use std::ffi::{c_char, c_void};
+use std::path::{Path, PathBuf};
use std::ptr::NonNull;
use crate::binary_view::{BinaryView, BinaryViewExt};
@@ -14,49 +15,45 @@ use crate::rc::Ref;
use crate::string::{raw_to_string, BnString, IntoCStr};
use crate::type_archive::{TypeArchive, TypeArchiveMergeConflict};
-// TODO: PathBuf
/// Get the default directory path for a remote Project. This is based off the Setting for
/// collaboration.directory, the project's id, and the project's remote's id.
-pub fn default_project_path(project: &RemoteProject) -> Result<BnString, ()> {
+pub fn default_project_path(project: &RemoteProject) -> Result<PathBuf, ()> {
let result = unsafe { BNCollaborationDefaultProjectPath(project.handle.as_ptr()) };
let success = !result.is_null();
success
- .then(|| unsafe { BnString::from_raw(result) })
+ .then(|| PathBuf::from(unsafe { BnString::into_string(result) }))
.ok_or(())
}
-// TODO: PathBuf
// Get the default filepath for a remote File. This is based off the Setting for
// collaboration.directory, the file's id, the file's project's id, and the file's
// remote's id.
-pub fn default_file_path(file: &RemoteFile) -> Result<BnString, ()> {
+pub fn default_file_path(file: &RemoteFile) -> Result<PathBuf, ()> {
let result = unsafe { BNCollaborationDefaultFilePath(file.handle.as_ptr()) };
let success = !result.is_null();
success
- .then(|| unsafe { BnString::from_raw(result) })
+ .then(|| PathBuf::from(unsafe { BnString::into_string(result) }))
.ok_or(())
}
-// TODO: AsRef<Path>
/// Download a file from its remote, saving all snapshots to a database in the
/// specified location. Returns a FileContext for opening the file later.
///
/// * `file` - Remote File to download and open
/// * `db_path` - File path for saved database
-pub fn download_file<S: IntoCStr>(file: &RemoteFile, db_path: S) -> Result<Ref<FileMetadata>, ()> {
+pub fn download_file(file: &RemoteFile, db_path: &Path) -> Result<Ref<FileMetadata>, ()> {
download_file_with_progress(file, db_path, NoProgressCallback)
}
-// TODO: AsRef<Path>
/// Download a file from its remote, saving all snapshots to a database in the
/// specified location. Returns a FileContext for opening the file later.
///
/// * `file` - Remote File to download and open
/// * `db_path` - File path for saved database
/// * `progress` - Function to call for progress updates
-pub fn download_file_with_progress<S: IntoCStr, F: ProgressCallback>(
+pub fn download_file_with_progress<F: ProgressCallback>(
file: &RemoteFile,
- db_path: S,
+ db_path: &Path,
mut progress: F,
) -> Result<Ref<FileMetadata>, ()> {
let db_path = db_path.to_cstr();
@@ -218,22 +215,18 @@ pub fn get_local_snapshot_for_remote(
.ok_or(())
}
-pub fn download_database<S>(file: &RemoteFile, location: S, force: bool) -> Result<(), ()>
-where
- S: IntoCStr,
-{
+pub fn download_database<S>(file: &RemoteFile, location: &Path, force: bool) -> Result<(), ()> {
download_database_with_progress(file, location, force, NoProgressCallback)
}
-pub fn download_database_with_progress<S, F>(
+pub fn download_database_with_progress<PC>(
file: &RemoteFile,
- location: S,
+ location: &Path,
force: bool,
- mut progress: F,
+ mut progress: PC,
) -> Result<(), ()>
where
- S: IntoCStr,
- F: ProgressCallback,
+ PC: ProgressCallback,
{
let db_path = location.to_cstr();
let success = unsafe {
@@ -241,8 +234,8 @@ where
file.handle.as_ptr(),
db_path.as_ptr(),
force,
- Some(F::cb_progress_callback),
- &mut progress as *mut _ as *mut c_void,
+ Some(PC::cb_progress_callback),
+ &mut progress as *mut PC as *mut c_void,
)
};
success.then_some(()).ok_or(())
@@ -475,10 +468,10 @@ pub fn get_snapshot_author(
/// * `database` - Parent database
/// * `snapshot` - Snapshot to edit
/// * `author` - Target author
-pub fn set_snapshot_author<S: IntoCStr>(
+pub fn set_snapshot_author(
database: &Database,
snapshot: &Snapshot,
- author: S,
+ author: &str,
) -> Result<(), ()> {
let author = author.to_cstr();
let success = unsafe {
@@ -650,9 +643,9 @@ pub fn get_remote_file_for_local_type_archive(database: &TypeArchive) -> Option<
}
/// Get the remote snapshot associated with a local snapshot (if it exists) in a Type Archive
-pub fn get_remote_snapshot_from_local_type_archive<S: IntoCStr>(
+pub fn get_remote_snapshot_from_local_type_archive(
type_archive: &TypeArchive,
- snapshot_id: S,
+ snapshot_id: &str,
) -> Option<Ref<RemoteSnapshot>> {
let snapshot_id = snapshot_id.to_cstr();
let value = unsafe {
@@ -679,10 +672,7 @@ pub fn get_local_snapshot_from_remote_type_archive(
}
/// Test if a snapshot is ignored from the archive
-pub fn is_type_archive_snapshot_ignored<S: IntoCStr>(
- type_archive: &TypeArchive,
- snapshot_id: S,
-) -> bool {
+pub fn is_type_archive_snapshot_ignored(type_archive: &TypeArchive, snapshot_id: &str) -> bool {
let snapshot_id = snapshot_id.to_cstr();
unsafe {
BNCollaborationIsTypeArchiveSnapshotIgnored(
@@ -694,19 +684,19 @@ pub fn is_type_archive_snapshot_ignored<S: IntoCStr>(
/// Download a type archive from its remote, saving all snapshots to an archive in the
/// specified `location`. Returns a [`TypeArchive`] for using later.
-pub fn download_type_archive<S: IntoCStr>(
+pub fn download_type_archive(
file: &RemoteFile,
- location: S,
+ location: &Path,
) -> Result<Option<Ref<TypeArchive>>, ()> {
download_type_archive_with_progress(file, location, NoProgressCallback)
}
/// Download a type archive from its remote, saving all snapshots to an archive in the
/// specified `location`. Returns a [`TypeArchive`] for using later.
-pub fn download_type_archive_with_progress<S: IntoCStr, F: ProgressCallback>(
+pub fn download_type_archive_with_progress<PC: ProgressCallback>(
file: &RemoteFile,
- location: S,
- mut progress: F,
+ location: &Path,
+ mut progress: PC,
) -> Result<Option<Ref<TypeArchive>>, ()> {
let mut value = std::ptr::null_mut();
let db_path = location.to_cstr();
@@ -714,8 +704,8 @@ pub fn download_type_archive_with_progress<S: IntoCStr, F: ProgressCallback>(
BNCollaborationDownloadTypeArchive(
file.handle.as_ptr(),
db_path.as_ptr(),
- Some(F::cb_progress_callback),
- &mut progress as *mut F as *mut c_void,
+ Some(PC::cb_progress_callback),
+ &mut progress as *mut PC as *mut c_void,
&mut value,
)
};