1use 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}