From 903bd86e5268892e43b06c331b231685cc39fbc7 Mon Sep 17 00:00:00 2001 From: Felix Krull Date: Wed, 12 Jun 2019 20:18:58 +0200 Subject: [PATCH] lib: clean up types for RepoCheckoutFilter --- .../rust/src/repo_checkout_at_options.rs | 37 +++---------------- .../repo_checkout_filter.rs | 19 +++++++--- 2 files changed, 20 insertions(+), 36 deletions(-) diff --git a/rust-bindings/rust/src/repo_checkout_at_options.rs b/rust-bindings/rust/src/repo_checkout_at_options.rs index 522b16f9..954a19fd 100644 --- a/rust-bindings/rust/src/repo_checkout_at_options.rs +++ b/rust-bindings/rust/src/repo_checkout_at_options.rs @@ -1,8 +1,7 @@ -use self::repo_checkout_filter::filter_trampoline; use glib::translate::{Stash, ToGlib, ToGlibPtr}; use glib_sys::gpointer; use libc::c_char; -use ostree_sys::{OstreeRepo, OstreeRepoCheckoutAtOptions, OstreeRepoCheckoutFilterResult}; +use ostree_sys::OstreeRepoCheckoutAtOptions; use std::path::{Path, PathBuf}; use {Repo, RepoCheckoutFilterResult}; use {RepoCheckoutMode, RepoCheckoutOverwriteMode}; @@ -24,7 +23,7 @@ pub struct RepoCheckoutAtOptions { pub force_copy_zerosized: bool, pub subpath: Option, pub devino_to_csum_cache: Option, - pub filter: RepoCheckoutFilter, + pub filter: Option, pub sepolicy: Option, pub sepolicy_prefix: Option, } @@ -81,18 +80,8 @@ impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOpt options.sepolicy = sepolicy.0; if let Some(filter) = &self.filter { - options.filter_user_data = filter - as *const Box RepoCheckoutFilterResult> - as gpointer; - options.filter = Some( - filter_trampoline - as unsafe extern "C" fn( - *mut OstreeRepo, - *const c_char, - *mut libc::stat, - gpointer, - ) -> OstreeRepoCheckoutFilterResult, - ); + options.filter_user_data = filter as *const RepoCheckoutFilter as gpointer; + options.filter = repo_checkout_filter::trampoline(); } Stash(options.as_ref(), (options, subpath, sepolicy_prefix)) @@ -184,24 +173,10 @@ mod tests { ); assert_eq!((*ptr).unused_ints, [0; 6]); assert_eq!((*ptr).unused_ptrs, [ptr::null_mut(); 3]); - assert_eq!( - (*ptr).filter, - Some( - filter_trampoline - as unsafe extern "C" fn( - *mut OstreeRepo, - *const c_char, - *mut libc::stat, - gpointer, - ) - -> OstreeRepoCheckoutFilterResult - ) - ); + assert_eq!((*ptr).filter, repo_checkout_filter::trampoline()); assert_eq!( (*ptr).filter_user_data, - options.filter.as_ref().unwrap() - as *const Box RepoCheckoutFilterResult> - as gpointer + options.filter.as_ref().unwrap() as *const RepoCheckoutFilter as gpointer ); assert_eq!((*ptr).sepolicy, options.sepolicy.to_glib_none().0); assert_eq!( diff --git a/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs index ff455425..e74016ad 100644 --- a/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs +++ b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs @@ -5,20 +5,29 @@ use libc::c_char; use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult}; use std::path::{Path, PathBuf}; -pub type RepoCheckoutFilter = - Option RepoCheckoutFilterResult>>; +pub type RepoCheckoutFilter = Box RepoCheckoutFilterResult>; -pub(super) unsafe extern "C" fn filter_trampoline( +unsafe extern "C" fn filter_trampoline( repo: *mut OstreeRepo, path: *const c_char, stat: *mut libc::stat, user_data: gpointer, ) -> OstreeRepoCheckoutFilterResult { // TODO: handle unwinding - let closure = - user_data as *const Box RepoCheckoutFilterResult>; + let closure = user_data as *const RepoCheckoutFilter; let repo = FromGlibPtrNone::from_glib_none(repo); let path: PathBuf = FromGlibPtrNone::from_glib_none(path); let result = (*closure)(&repo, &path, &*stat); result.to_glib() } + +pub(super) fn trampoline() -> Option< + unsafe extern "C" fn( + *mut OstreeRepo, + *const c_char, + *mut libc::stat, + gpointer, + ) -> OstreeRepoCheckoutFilterResult, +> { + Some(filter_trampoline) +}