use crate::ffi::ErrorCode;
#[doc(hidden)]
pub use crate::ffi::resource_v1::API as FFI_API;
pub use crate::ffi::resource_v1::ResourceHandleRepr;
pub fn get(name: &'static str) -> Option<&'static [u8]> {
get_dynamic(name)
}
pub fn get_dynamic(name: &str) -> Option<&'static [u8]> {
match crate::ffi::resource_v0::get_static(name) {
Ok(r) => Some(unsafe { std::slice::from_raw_parts(r.ptr as *const u8, r.size as usize) }),
Err(ErrorCode::NotFound) => None,
Err(error_code) => panic!(
"Resource get '{}' failed with code {}",
name, error_code as u32
),
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "with_speedy", derive(speedy::Writable, speedy::Readable))]
pub struct ResourceHandle {
inner: ResourceHandleRepr,
}
impl ResourceHandle {
#[inline]
pub fn request(name: &str) -> Self {
let inner = crate::ffi::resource_v1::request_resource_by_name(name);
Self { inner }
}
#[inline]
pub fn try_retrieve(&self) -> Option<Vec<u8>> {
match crate::ffi::resource_v1::try_retrieve(self.inner) {
Ok(bytes) => Some(bytes),
Err(ErrorCode::Unavailable) => None,
Err(error_code) => panic!(
"Failed retrieving resource bytes with code: {}",
error_code as u32
), }
}
#[inline]
pub fn is_ready(&self) -> bool {
match crate::ffi::resource_v1::is_ready(self.inner) {
Ok(()) => true,
Err(ErrorCode::Unavailable) => false,
Err(error_code) => panic!("Failed `ResourceHandle::is_ready`: {}", error_code as u32),
}
}
#[inline]
pub fn raw(&self) -> ResourceHandleRepr {
self.inner
}
}