minion_sys/error.rs
1//! Error types.
2
3use thiserror::Error;
4
5use crate::ffi;
6
7/// Wraps all error types returned by `minion-sys`.
8#[derive(Debug, Error)]
9#[non_exhaustive]
10pub enum MinionError {
11 /// An error has occurred during the execution of Minion.
12 #[error("runtime error: `{0}.to_string()`")]
13 RuntimeError(#[from] RuntimeError),
14
15 /// The input model uses Minion features that are not yet implemented in `minion_rs`.
16 #[error("not implemented: {0}")]
17 NotImplemented(String),
18
19 /// Catch-all error.
20 #[error(transparent)]
21 Other(#[from] anyhow::Error), // source and Display delegate to anyhow::Error
22}
23
24/// Errors thrown by Minion during execution.
25///
26/// These represent internal Minion C++ exceptions translated into Rust.
27///
28/// Invalid usage of this library should throw an error before Minion is even run. Therefore, these
29/// should be quite rare. Consider creating an issue on
30/// [Github](https://github.com/conjure-cp/conjure-oxide) if these occur regularly!
31#[derive(Debug, Error, Eq, PartialEq)]
32#[non_exhaustive]
33pub enum RuntimeError {
34 // These closely follow the ReturnCodes found in Minion's libwrapper.cpp.
35 /// The model given to Minion is invalid.
36 #[error("the given instance is invalid")]
37 InvalidInstance,
38
39 /// The solver exceeded its time limit.
40 #[error("solver timed out")]
41 Timeout,
42
43 /// The solver ran out of memory.
44 #[error("solver ran out of memory")]
45 MemoryError,
46
47 /// An unknown error has occurred.
48 #[error("an unknown error has occurred while running minion")]
49 UnknownError,
50}
51
52// Minion's ReturnCodes are passed over FFI as ints.
53// Convert them to their appropriate error.
54impl From<u32> for RuntimeError {
55 fn from(return_code: u32) -> Self {
56 match return_code {
57 #[allow(non_upper_case_globals)]
58 ffi::ReturnCodes_INVALID_INSTANCE => RuntimeError::InvalidInstance,
59 #[allow(non_upper_case_globals)]
60 ffi::ReturnCodes_TIMEOUT => RuntimeError::Timeout,
61 #[allow(non_upper_case_globals)]
62 ffi::ReturnCodes_MEMORY_ERROR => RuntimeError::MemoryError,
63 _ => RuntimeError::UnknownError,
64 }
65 }
66}