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}