1use proc_macro::TokenStream;
2use quote::*;
3use syn::*;
4
5pub fn impl_load_trait(ast: &DeriveInput) -> TokenStream {
6 let name = &ast.ident;
7
8 let name_str = name.to_string();
9
10 let load = Ident::new(format!("{}_{}", name_str, "load").as_str(), name.span());
11 let loadMem = Ident::new(format!("{}_{}", name_str, "loadMem").as_str(), name.span());
12 let loadMemEx = Ident::new(
13 format!("{}_{}", name_str, "loadMemEx").as_str(),
14 name.span(),
15 );
16
17 let gen = quote! {
18 unsafe impl LoadExt for #name {
19 fn load<P: AsRef<Path>>(&mut self, path: P) -> Result<(), SoloudError> {
20 unsafe {
21 let path = std::ffi::CString::new(path.as_ref().to_str().ok_or(SoloudError::Internal(SoloudErrorKind::FileLoadFailed))?)?;
22 let ret = soloud_sys::soloud::#load(self._inner, path.as_ref().as_ptr());
23 if ret != 0 {
24 Err(SoloudError::Internal(SoloudErrorKind::from_i32(ret)))
25 } else {
26 Ok(())
27 }
28 }
29 }
30
31 unsafe fn _load_mem_ex(&mut self, data: &[u8], copy: bool, take_ownership: bool) -> Result<(), SoloudError> {
32 unsafe {
33 let ret = soloud_sys::soloud::#loadMemEx(self._inner, data.as_ptr(), data.len() as u32, copy as i32, take_ownership as i32);
34 if ret != 0 {
35 Err(SoloudError::Internal(SoloudErrorKind::from_i32(ret)))
36 } else {
37 Ok(())
38 }
39 }
40 }
41 }
42 };
43 gen.into()
44}