Skip to main content

scopinator_types/
enums.rs

1use serde::{Deserialize, Serialize};
2
3/// Tracking rate for a telescope mount.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5#[non_exhaustive]
6pub enum TrackingRate {
7    Sidereal,
8    Lunar,
9    Solar,
10    King,
11    Custom,
12    Off,
13}
14
15/// Current slew state of a mount.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
17#[non_exhaustive]
18pub enum SlewState {
19    Idle,
20    Slewing,
21    Tracking,
22    Parked,
23    Homing,
24    Error,
25}
26
27/// Current state of a camera.
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
29#[non_exhaustive]
30pub enum CameraState {
31    Idle,
32    Waiting,
33    Exposing,
34    Reading,
35    Downloading,
36    Error,
37}
38
39/// Pier side for German equatorial mounts.
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
41#[non_exhaustive]
42pub enum PierSide {
43    East,
44    West,
45    Unknown,
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51    use proptest::prelude::*;
52
53    fn tracking_rates() -> impl Strategy<Value = TrackingRate> {
54        prop_oneof![
55            Just(TrackingRate::Sidereal),
56            Just(TrackingRate::Lunar),
57            Just(TrackingRate::Solar),
58            Just(TrackingRate::King),
59            Just(TrackingRate::Custom),
60            Just(TrackingRate::Off),
61        ]
62    }
63
64    fn slew_states() -> impl Strategy<Value = SlewState> {
65        prop_oneof![
66            Just(SlewState::Idle),
67            Just(SlewState::Slewing),
68            Just(SlewState::Tracking),
69            Just(SlewState::Parked),
70            Just(SlewState::Homing),
71            Just(SlewState::Error),
72        ]
73    }
74
75    fn camera_states() -> impl Strategy<Value = CameraState> {
76        prop_oneof![
77            Just(CameraState::Idle),
78            Just(CameraState::Waiting),
79            Just(CameraState::Exposing),
80            Just(CameraState::Reading),
81            Just(CameraState::Downloading),
82            Just(CameraState::Error),
83        ]
84    }
85
86    fn pier_sides() -> impl Strategy<Value = PierSide> {
87        prop_oneof![
88            Just(PierSide::East),
89            Just(PierSide::West),
90            Just(PierSide::Unknown),
91        ]
92    }
93
94    proptest! {
95        #[test]
96        fn tracking_rate_roundtrip(rate in tracking_rates()) {
97            let s = serde_json::to_string(&rate).unwrap();
98            let back: TrackingRate = serde_json::from_str(&s).unwrap();
99            prop_assert_eq!(rate, back);
100        }
101
102        #[test]
103        fn slew_state_roundtrip(state in slew_states()) {
104            let s = serde_json::to_string(&state).unwrap();
105            let back: SlewState = serde_json::from_str(&s).unwrap();
106            prop_assert_eq!(state, back);
107        }
108
109        #[test]
110        fn camera_state_roundtrip(state in camera_states()) {
111            let s = serde_json::to_string(&state).unwrap();
112            let back: CameraState = serde_json::from_str(&s).unwrap();
113            prop_assert_eq!(state, back);
114        }
115
116        #[test]
117        fn pier_side_roundtrip(side in pier_sides()) {
118            let s = serde_json::to_string(&side).unwrap();
119            let back: PierSide = serde_json::from_str(&s).unwrap();
120            prop_assert_eq!(side, back);
121        }
122    }
123}