mono_rs/
image.rs

1use std::{
2    ffi::{c_void, CString},
3    sync::Arc,
4};
5
6use crate::{
7    assembly::Assembly,
8    bindings::{mono_class_from_name, MonoImage},
9    class::Class,
10    domain::Domain,
11    void::AsRawVoid,
12    MonoResult,
13};
14
15#[derive(Clone, Debug)]
16pub struct Image {
17    pub mono_ptr: *mut MonoImage,
18    pub assembly: Arc<Assembly>,
19    pub domain: Arc<Domain>,
20}
21
22impl Image {
23    pub fn get_class_by_name<T: AsRef<str>>(&self, name_space: T, name: T) -> MonoResult<Class> {
24        let name = CString::new(name.as_ref())?;
25        let name_space = CString::new(name_space.as_ref())?;
26        let mono_ptr =
27            unsafe { mono_class_from_name(self.mono_ptr, name_space.as_ptr(), name.as_ptr()) };
28
29        if mono_ptr.is_null() {
30            return Err("MonoClass Null Error!".into());
31        }
32
33        Ok(Class {
34            mono_ptr,
35            assembly: self.assembly.clone(),
36            domain: self.domain.clone(),
37            image: Arc::new(self.clone()),
38        })
39    }
40}
41
42impl AsRawVoid for Image {
43    fn as_raw_void(self) -> *mut c_void {
44        self.mono_ptr as *mut c_void
45    }
46}