diff --git a/rust-bindings/rust/src/repo_checkout_at_options.rs b/rust-bindings/rust/src/repo_checkout_at_options.rs index b69e2c30..522b16f9 100644 --- a/rust-bindings/rust/src/repo_checkout_at_options.rs +++ b/rust-bindings/rust/src/repo_checkout_at_options.rs @@ -1,4 +1,5 @@ -use glib::translate::{FromGlibPtrNone, Stash, ToGlib, ToGlibPtr}; +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}; @@ -7,8 +8,9 @@ use {Repo, RepoCheckoutFilterResult}; use {RepoCheckoutMode, RepoCheckoutOverwriteMode}; use {RepoDevInoCache, SePolicy}; -pub type RepoCheckoutFilter = - Option RepoCheckoutFilterResult>>; +mod repo_checkout_filter; + +pub use self::repo_checkout_filter::RepoCheckoutFilter; pub struct RepoCheckoutAtOptions { pub mode: RepoCheckoutMode, @@ -22,7 +24,6 @@ pub struct RepoCheckoutAtOptions { pub force_copy_zerosized: bool, pub subpath: Option, pub devino_to_csum_cache: Option, - // TODO: might be interesting to turn this into a type parameter pub filter: RepoCheckoutFilter, pub sepolicy: Option, pub sepolicy_prefix: Option, @@ -51,21 +52,6 @@ impl Default for RepoCheckoutAtOptions { type StringStash<'a, T> = Stash<'a, *const c_char, Option>; -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 repo = FromGlibPtrNone::from_glib_none(repo); - let path: PathBuf = FromGlibPtrNone::from_glib_none(path); - let result = (*closure)(&repo, &path, &*stat); - result.to_glib() -} - impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOptions { type Storage = ( Box, 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 new file mode 100644 index 00000000..ff455425 --- /dev/null +++ b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs @@ -0,0 +1,24 @@ +use crate::{Repo, RepoCheckoutFilterResult}; +use glib::translate::{FromGlibPtrNone, ToGlib}; +use glib_sys::gpointer; +use libc::c_char; +use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult}; +use std::path::{Path, PathBuf}; + +pub type RepoCheckoutFilter = + Option RepoCheckoutFilterResult>>; + +pub(super) 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 repo = FromGlibPtrNone::from_glib_none(repo); + let path: PathBuf = FromGlibPtrNone::from_glib_none(path); + let result = (*closure)(&repo, &path, &*stat); + result.to_glib() +}