mono_rs/
field.rs

1use std::{ffi::c_void, sync::Arc};
2
3use crate::{
4    assembly::Assembly,
5    bindings::{mono_field_get_value_object, MonoClassField},
6    class::Class,
7    domain::Domain,
8    image::Image,
9    object::Object,
10    void::AsRawVoid,
11    MonoResult,
12};
13
14#[derive(Clone, Debug)]
15pub struct ClassField {
16    pub mono_ptr: *mut MonoClassField,
17    pub assembly: Arc<Assembly>,
18    pub class: Arc<Class>,
19    pub domain: Arc<Domain>,
20    pub image: Arc<Image>,
21}
22
23#[derive(Clone, Debug)]
24pub struct ObjectField {
25    pub mono_ptr: *mut MonoClassField,
26    pub assembly: Arc<Assembly>,
27    pub class: Arc<Class>,
28    pub domain: Arc<Domain>,
29    pub image: Arc<Image>,
30    pub object: Arc<Object>,
31}
32
33#[derive(Clone, Debug)]
34pub struct StaticField {
35    pub mono_ptr: *mut MonoClassField,
36    pub assembly: Arc<Assembly>,
37    pub class: Arc<Class>,
38    pub domain: Arc<Domain>,
39    pub image: Arc<Image>,
40}
41
42impl ObjectField {
43    pub fn get_value_object(&self) -> MonoResult<Object> {
44        let mono_ptr = unsafe {
45            mono_field_get_value_object(self.domain.mono_ptr, self.mono_ptr, self.object.mono_ptr)
46        };
47
48        if mono_ptr.is_null() {
49            return Err("MonoField ValueObject Null Error!".into());
50        }
51
52        Ok(Object {
53            mono_ptr,
54            assembly: self.assembly.clone(),
55            class: self.class.clone(),
56            domain: self.domain.clone(),
57            image: self.image.clone(),
58        })
59    }
60}
61
62impl AsRawVoid for ClassField {
63    fn as_raw_void(self) -> *mut c_void {
64        self.mono_ptr as *mut c_void
65    }
66}
67
68impl AsRawVoid for ObjectField {
69    fn as_raw_void(self) -> *mut c_void {
70        self.mono_ptr as *mut c_void
71    }
72}
73
74impl AsRawVoid for StaticField {
75    fn as_raw_void(self) -> *mut c_void {
76        self.mono_ptr as *mut c_void
77    }
78}