Skip to main content

mono_rt/
error.rs

1//! Errors related to Mono.
2
3use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, MonoError>;
6
7#[derive(Debug, Error)]
8pub enum MonoError {
9    #[error("DLL `{0}` not found")]
10    DllNotFound(String),
11    #[error("Export not found in DLL: `{0}`")]
12    FnNotFound(&'static str),
13    #[error("Mono API already initialized! Multiple calls to `mono::init()` are not necessary.")]
14    AlreadyInitialized,
15    #[error("Mono API not initialized! Call `mono::init()` first.")]
16    Uninitialized,
17    #[error("string argument contains an interior null byte")]
18    NullByteInName,
19    #[error("managed exception was thrown during method invocation")]
20    ManagedException(crate::MonoObject),
21    #[error("failed to open assembly image: {0}")]
22    ImageOpenFailed(crate::MonoImageOpenStatus),
23}
24
25#[cfg(test)]
26mod tests {
27    use std::error::Error;
28
29    use super::MonoError;
30    use crate::MonoObject;
31
32    #[test]
33    fn dll_not_found_display() {
34        let e = MonoError::DllNotFound("mono.dll".to_owned());
35        assert_eq!(e.to_string(), "DLL `mono.dll` not found");
36    }
37
38    #[test]
39    fn fn_not_found_display() {
40        let e = MonoError::FnNotFound("mono_get_root_domain");
41        assert_eq!(
42            e.to_string(),
43            "Export not found in DLL: `mono_get_root_domain`"
44        );
45    }
46
47    #[test]
48    fn already_initialized_display() {
49        let e = MonoError::AlreadyInitialized;
50        assert!(e.to_string().contains("already initialized"));
51    }
52
53    #[test]
54    fn uninitialized_display() {
55        let e = MonoError::Uninitialized;
56        assert!(e.to_string().contains("not initialized"));
57    }
58
59    #[test]
60    fn null_byte_in_name_display() {
61        let e = MonoError::NullByteInName;
62        assert_eq!(
63            e.to_string(),
64            "string argument contains an interior null byte"
65        );
66    }
67
68    #[test]
69    fn managed_exception_display() {
70        let obj = unsafe { MonoObject::from_ptr_unchecked(std::ptr::dangling_mut()) };
71        let e = MonoError::ManagedException(obj);
72        assert_eq!(
73            e.to_string(),
74            "managed exception was thrown during method invocation"
75        );
76    }
77
78    #[test]
79    fn implements_std_error_trait() {
80        let e: Box<dyn Error> = Box::new(MonoError::Uninitialized);
81        assert!(e.source().is_none());
82    }
83
84    #[test]
85    fn dll_not_found_debug_contains_variant_name() {
86        let e = MonoError::DllNotFound("x.dll".to_owned());
87        assert!(format!("{e:?}").contains("DllNotFound"));
88    }
89
90    #[test]
91    fn fn_not_found_debug_contains_variant_name() {
92        let e = MonoError::FnNotFound("some_export");
93        assert!(format!("{e:?}").contains("FnNotFound"));
94    }
95}