Skip to main content

microde_application/
stop_request.rs

1use crate::MicrodeError;
2
3/// A non-blocking request for orderly lifecycle termination.
4#[derive(Debug, Clone, PartialEq, Eq, Default)]
5pub struct MicrodeStopRequest {
6    pub exit_code: Option<i32>,
7    pub error: Option<MicrodeError>,
8}
9
10impl MicrodeStopRequest {
11    pub const fn success() -> Self {
12        Self {
13            exit_code: None,
14            error: None,
15        }
16    }
17
18    pub const fn with_exit_code(exit_code: i32) -> Self {
19        Self {
20            exit_code: Some(exit_code),
21            error: None,
22        }
23    }
24
25    pub fn with_error(error: MicrodeError) -> Self {
26        Self {
27            exit_code: None,
28            error: Some(error),
29        }
30    }
31
32    pub fn with_exit_code_and_error(exit_code: i32, error: MicrodeError) -> Self {
33        Self {
34            exit_code: Some(exit_code),
35            error: Some(error),
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn constructors_capture_each_supported_shape() {
46        let error = MicrodeError::new("stop failed");
47
48        assert_eq!(MicrodeStopRequest::success(), MicrodeStopRequest::default());
49        assert_eq!(
50            MicrodeStopRequest::with_exit_code(42),
51            MicrodeStopRequest {
52                exit_code: Some(42),
53                error: None,
54            }
55        );
56        assert_eq!(
57            MicrodeStopRequest::with_error(error.clone()),
58            MicrodeStopRequest {
59                exit_code: None,
60                error: Some(error.clone()),
61            }
62        );
63        assert_eq!(
64            MicrodeStopRequest::with_exit_code_and_error(7, error.clone()),
65            MicrodeStopRequest {
66                exit_code: Some(7),
67                error: Some(error),
68            }
69        );
70    }
71}