use std::ffi::{CString, OsString};
use std::{fs, path, ptr};
use glib::translate::FromGlibPtrFull;
pub fn call_with_gerror<T, F>(f: F) -> Result<*mut T, glib::error::Error>
where
F: FnOnce(*mut *mut glib::ffi::GError) -> *mut T,
{
let mut err = ptr::null_mut();
let return_value = f(&mut err as *mut *mut glib::ffi::GError);
if return_value.is_null() {
unsafe { Err(glib::error::Error::from_glib_full(err)) }
} else {
Ok(return_value)
}
}
pub fn path_to_glib_url<P: AsRef<path::Path>>(p: P) -> Result<CString, glib::error::Error> {
let canonical = fs::canonicalize(p).map_err(|_| {
glib::error::Error::new(
glib::FileError::Noent,
"Could not turn path into canonical path. Maybe it does not exist?",
)
})?;
let mut osstr_path: OsString = "file:///".into();
osstr_path.push(canonical);
let pdf_string = osstr_path.into_string().map_err(|_| {
glib::error::Error::new(
glib::FileError::Inval,
"Path invalid (contains non-utf8 characters)",
)
})?;
CString::new(pdf_string).map_err(|_| {
glib::error::Error::new(
glib::FileError::Inval,
"Path invalid (contains NUL characters)",
)
})
}