1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::NyxError;
use std::convert::TryFrom;
#[derive(Copy, Clone, Debug)]
#[allow(clippy::upper_case_acronyms)]
pub enum Bodies {
SSB,
Sun,
MercuryBarycenter,
Mercury,
VenusBarycenter,
Venus,
EarthBarycenter,
Earth,
Luna,
MarsBarycenter,
JupiterBarycenter,
SaturnBarycenter,
UranusBarycenter,
NeptuneBarycenter,
PlutoBarycenter,
}
impl Bodies {
pub fn ephem_path(&self) -> &'static [usize] {
match *self {
Self::SSB => &[],
Self::Sun => &[0],
Self::MercuryBarycenter => &[1],
Self::Mercury => &[1],
Self::VenusBarycenter => &[2],
Self::Venus => &[2],
Self::EarthBarycenter => &[3],
Self::Earth => &[3, 0],
Self::Luna => &[3, 1],
Self::MarsBarycenter => &[4],
Self::JupiterBarycenter => &[5],
Self::SaturnBarycenter => &[6],
Self::UranusBarycenter => &[7],
Self::NeptuneBarycenter => &[8],
Self::PlutoBarycenter => &[9],
}
}
pub fn name(&self) -> String {
match *self {
Self::SSB => "Solar System Barycenter".to_string(),
Self::Sun => "Sun".to_string(),
Self::MercuryBarycenter => "Mercury".to_string(),
Self::Mercury => "Mercury".to_string(),
Self::VenusBarycenter => "Venus".to_string(),
Self::Venus => "Venus".to_string(),
Self::EarthBarycenter => "Earth Moon Barycenter".to_string(),
Self::Earth => "Earth".to_string(),
Self::Luna => "Moon".to_string(),
Self::MarsBarycenter => "Mars".to_string(),
Self::JupiterBarycenter => "Jupiter Barycenter".to_string(),
Self::SaturnBarycenter => "Saturn Barycenter".to_string(),
Self::UranusBarycenter => "Uranus Barycenter".to_string(),
Self::NeptuneBarycenter => "Neptune Barycenter".to_string(),
Self::PlutoBarycenter => "Pluto Barycenter".to_string(),
}
}
}
impl TryFrom<String> for Bodies {
type Error = NyxError;
fn try_from(name: String) -> Result<Self, Self::Error> {
match name.to_lowercase().as_str() {
"solar system barycenter" | "ssb" => Ok(Self::SSB),
"sun" => Ok(Self::Sun),
"mercury" => Ok(Self::Mercury),
"venus" => Ok(Self::Venus),
"earth moon barycenter" => Ok(Self::EarthBarycenter),
"earth" => Ok(Self::Earth),
"moon" | "luna" => Ok(Self::Luna),
"mars" | "mars barycenter" => Ok(Self::MarsBarycenter),
"jupiter" | "jupiter barycenter" => Ok(Self::JupiterBarycenter),
"saturn" | "saturn barycenter" => Ok(Self::SaturnBarycenter),
"uranus" | "uranus barycenter" => Ok(Self::UranusBarycenter),
"neptune" | "neptune barycenter" => Ok(Self::NeptuneBarycenter),
"pluto" | "pluto barycenter" => Ok(Self::PlutoBarycenter),
_ => Err(NyxError::ObjectNotFound(name)),
}
}
}
impl TryFrom<Vec<usize>> for Bodies {
type Error = NyxError;
fn try_from(ephem_path: Vec<usize>) -> Result<Self, Self::Error> {
match ephem_path.len() {
0 => Ok(Self::SSB),
1 => match ephem_path[0] {
0 => Ok(Self::Sun),
1 => Ok(Self::Mercury),
2 => Ok(Self::Venus),
3 => Ok(Self::EarthBarycenter),
4 => Ok(Self::MarsBarycenter),
5 => Ok(Self::JupiterBarycenter),
6 => Ok(Self::SaturnBarycenter),
7 => Ok(Self::UranusBarycenter),
8 => Ok(Self::NeptuneBarycenter),
9 => Ok(Self::PlutoBarycenter),
_ => Err(NyxError::ObjectNotFound(format!("{:?}", ephem_path))),
},
2 if ephem_path[0] == 3 => match ephem_path[1] {
0 => Ok(Self::Earth),
1 => Ok(Self::Luna),
_ => Err(NyxError::ObjectNotFound(format!("{:?}", ephem_path))),
},
_ => Err(NyxError::ObjectNotFound(format!("{:?}", ephem_path))),
}
}
}