Implement Repo::write_metadata_async
This commit is contained in:
parent
8002e06e25
commit
e424800f05
|
|
@ -254,4 +254,85 @@ impl Repo {
|
||||||
cancellable
|
cancellable
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn write_metadata_async<
|
||||||
|
P: IsA<gio::Cancellable>,
|
||||||
|
Q: FnOnce(Result<Checksum, Error>) + Send + 'static,
|
||||||
|
>(
|
||||||
|
&self,
|
||||||
|
objtype: ObjectType,
|
||||||
|
expected_checksum: Option<&str>,
|
||||||
|
object: &glib::Variant,
|
||||||
|
cancellable: Option<&P>,
|
||||||
|
callback: Q,
|
||||||
|
) {
|
||||||
|
let user_data: Box<Q> = Box::new(callback);
|
||||||
|
unsafe extern "C" fn write_metadata_async_trampoline<
|
||||||
|
Q: FnOnce(Result<Checksum, Error>) + Send + 'static,
|
||||||
|
>(
|
||||||
|
_source_object: *mut gobject_sys::GObject,
|
||||||
|
res: *mut gio_sys::GAsyncResult,
|
||||||
|
user_data: glib_sys::gpointer,
|
||||||
|
) {
|
||||||
|
let mut error = ptr::null_mut();
|
||||||
|
let mut out_csum = MaybeUninit::uninit();
|
||||||
|
let _ = ostree_sys::ostree_repo_write_metadata_finish(
|
||||||
|
_source_object as *mut _,
|
||||||
|
res,
|
||||||
|
out_csum.as_mut_ptr(),
|
||||||
|
&mut error,
|
||||||
|
);
|
||||||
|
let out_csum = out_csum.assume_init();
|
||||||
|
let result = if error.is_null() {
|
||||||
|
Ok(Checksum::from_glib_full(out_csum))
|
||||||
|
} else {
|
||||||
|
Err(from_glib_full(error))
|
||||||
|
};
|
||||||
|
let callback: Box<Q> = Box::from_raw(user_data as *mut _);
|
||||||
|
callback(result);
|
||||||
|
}
|
||||||
|
let callback = write_metadata_async_trampoline::<Q>;
|
||||||
|
unsafe {
|
||||||
|
ostree_sys::ostree_repo_write_metadata_async(
|
||||||
|
self.to_glib_none().0,
|
||||||
|
objtype.to_glib(),
|
||||||
|
expected_checksum.to_glib_none().0,
|
||||||
|
object.to_glib_none().0,
|
||||||
|
cancellable.map(|p| p.as_ref()).to_glib_none().0,
|
||||||
|
Some(callback),
|
||||||
|
Box::into_raw(user_data) as *mut _,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "futures")]
|
||||||
|
pub fn write_metadata_async_future(
|
||||||
|
&self,
|
||||||
|
objtype: ObjectType,
|
||||||
|
expected_checksum: Option<&str>,
|
||||||
|
object: &glib::Variant,
|
||||||
|
) -> Box_<dyn future::Future<Output = Result<Checksum, Error>> + std::marker::Unpin> {
|
||||||
|
use fragile::Fragile;
|
||||||
|
use gio::GioFuture;
|
||||||
|
|
||||||
|
let expected_checksum = expected_checksum.map(ToOwned::to_owned);
|
||||||
|
let object = object.clone();
|
||||||
|
GioFuture::new(self, move |obj, send| {
|
||||||
|
let cancellable = gio::Cancellable::new();
|
||||||
|
let send = Fragile::new(send);
|
||||||
|
obj.write_metadata_async(
|
||||||
|
objtype,
|
||||||
|
expected_checksum
|
||||||
|
.as_ref()
|
||||||
|
.map(::std::borrow::Borrow::borrow),
|
||||||
|
&object,
|
||||||
|
Some(&cancellable),
|
||||||
|
move |res| {
|
||||||
|
let _ = send.into_inner().send(res);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
cancellable
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue