sim_lib_interference_solve/
scenario_error.rs1use std::fmt;
4
5use sim_lib_interference_core::InterferenceError;
6
7#[derive(Clone, Debug, PartialEq)]
9pub enum ScenarioError {
10 InvalidLimit {
12 name: &'static str,
14 value: usize,
16 absolute_maximum: usize,
18 },
19 ZeroElementDimension {
21 name: &'static str,
23 },
24 SourceCountOverflow {
26 rows: usize,
28 columns: usize,
30 },
31 SourceLimitExceeded {
33 requested: usize,
35 limit: usize,
37 },
38 GeneratedIdLimitExceeded {
40 requested: usize,
42 limit: usize,
44 },
45 TotalIdLimitExceeded {
47 requested: usize,
49 limit: usize,
51 },
52 SparseAperture {
54 axis: &'static str,
56 spacing_wavelengths: f64,
58 maximum_wavelengths: f64,
60 },
61 Core {
63 cause: Box<InterferenceError>,
65 },
66 AllocationFailed {
68 sources: usize,
70 },
71}
72
73impl From<InterferenceError> for ScenarioError {
74 fn from(cause: InterferenceError) -> Self {
75 Self::Core {
76 cause: Box::new(cause),
77 }
78 }
79}
80
81impl fmt::Display for ScenarioError {
82 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
83 match self {
84 Self::InvalidLimit {
85 name,
86 value,
87 absolute_maximum,
88 } => write!(
89 formatter,
90 "scenario limit `{name}` must be in 1..={absolute_maximum}: {value}"
91 ),
92 Self::ZeroElementDimension { name } => {
93 write!(
94 formatter,
95 "scenario element dimension `{name}` must be non-zero"
96 )
97 }
98 Self::SourceCountOverflow { rows, columns } => write!(
99 formatter,
100 "scenario source count overflows usize: {rows} rows by {columns} columns"
101 ),
102 Self::SourceLimitExceeded { requested, limit } => write!(
103 formatter,
104 "scenario requests {requested} sources but the limit is {limit}"
105 ),
106 Self::GeneratedIdLimitExceeded { requested, limit } => write!(
107 formatter,
108 "scenario generated id requires {requested} bytes but the limit is {limit}"
109 ),
110 Self::TotalIdLimitExceeded { requested, limit } => write!(
111 formatter,
112 "scenario generated ids require {requested} bytes but the limit is {limit}"
113 ),
114 Self::SparseAperture {
115 axis,
116 spacing_wavelengths,
117 maximum_wavelengths,
118 } => write!(
119 formatter,
120 "strict aperture spacing on `{axis}` is {spacing_wavelengths:?} wavelengths, \
121 above {maximum_wavelengths:?}"
122 ),
123 Self::Core { cause } => write!(formatter, "scenario input is invalid: {cause}"),
124 Self::AllocationFailed { sources } => {
125 write!(
126 formatter,
127 "could not reserve storage for {sources} scenario sources"
128 )
129 }
130 }
131 }
132}
133
134impl std::error::Error for ScenarioError {
135 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
136 match self {
137 Self::Core { cause } => Some(cause.as_ref()),
138 _ => None,
139 }
140 }
141}