extern crate alloc;
use alloc::boxed::Box;
use alloc::vec;
use core::ffi::CStr;
use super::service_call::ServiceCall;
use crate::resource::Resource;
pub struct Resources<'a> {
service_call: &'a ServiceCall,
}
impl<'a> Resources<'a> {
pub fn get(&self, name: &CStr) -> Result<Resource, &str> {
self.service_call
.get_resource(name)
.map(|(size, data)| Resource::new(name, size, data))
}
pub fn load(&self, resource: &Resource, offset: usize, dest: &mut [u8]) -> Result<(), &str> {
self.service_call
.load_resource(resource.name(), offset, dest)
}
pub fn load_all(&self, resource: &Resource) -> Result<Box<[u8]>, &str> {
let mut buffer = vec![0; resource.size()].into_boxed_slice();
self.load(resource, 0, buffer.as_mut()).map(|_| buffer)
}
pub(crate) fn new(service_call: &'a ServiceCall) -> Self {
Self { service_call }
}
}