soloud_derive/
load.rs

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}