1use crate::G14_safe::eraEra00_safe;
14use crate::G19_safe::eraIr_safe;
15use crate::G26_safe::{eraPnm00a_safe, eraPnm00b_safe, eraPnm06a_safe, eraPom00_safe};
16use crate::G28_safe::{eraRy_safe, eraRz_safe};
17use crate::G29_safe::eraS00_safe;
18use crate::G30_safe::{eraS06_safe, eraSp00_safe};
19use crate::G6_safe::eraBpn2xy_safe;
20use crate::G8_safe::eraC2tcio_safe;
21
22pub type ErfaResult<T> = Result<T, ()>;
23
24pub fn eraC2i00a_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
26 let rbpn = eraPnm00a_safe(date1, date2)?;
27 eraC2ibpn_safe(date1, date2, &rbpn)
28}
29
30pub fn eraC2i00b_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
32 let rbpn = eraPnm00b_safe(date1, date2)?;
33 eraC2ibpn_safe(date1, date2, &rbpn)
34}
35
36pub fn eraC2i06a_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
38 let rbpn = eraPnm06a_safe(date1, date2)?;
39 let (x, y) = eraBpn2xy_safe(&rbpn)?;
40 let s = eraS06_safe(date1, date2, x, y)?;
41 eraC2ixys_safe(x, y, s)
42}
43
44pub fn eraC2ibpn_safe(date1: f64, date2: f64, rbpn: &[[f64; 3]; 3]) -> ErfaResult<[[f64; 3]; 3]> {
46 let (x, y) = eraBpn2xy_safe(rbpn)?;
47 eraC2ixy_safe(date1, date2, x, y)
48}
49
50pub fn eraC2ixy_safe(date1: f64, date2: f64, x: f64, y: f64) -> ErfaResult<[[f64; 3]; 3]> {
52 let s = eraS00_safe(date1, date2, x, y)?;
53 eraC2ixys_safe(x, y, s)
54}
55
56pub fn eraC2ixys_safe(x: f64, y: f64, s: f64) -> ErfaResult<[[f64; 3]; 3]> {
58 let r2 = x * x + y * y;
60 let e = if r2 > 0.0 { y.atan2(x) } else { 0.0 };
61 let d = (r2 / (1.0 - r2)).sqrt().atan();
62
63 let mut rc2i = [[0.0_f64; 3]; 3];
65 eraIr_safe(&mut rc2i)?;
66 eraRz_safe(e, &mut rc2i)?;
67 eraRy_safe(d, &mut rc2i)?;
68 eraRz_safe(-(e + s), &mut rc2i)?;
69 Ok(rc2i)
70}
71
72pub fn eraC2s_safe(p: &[f64; 3]) -> ErfaResult<(f64, f64)> {
74 let x = p[0];
75 let y = p[1];
76 let z = p[2];
77 let d2 = x * x + y * y;
78 let theta = if d2 == 0.0 { 0.0 } else { y.atan2(x) };
79 let phi = if z == 0.0 { 0.0 } else { z.atan2(d2.sqrt()) };
80 Ok((theta, phi))
81}
82
83pub fn eraC2t00a_safe(
85 tta: f64,
86 ttb: f64,
87 uta: f64,
88 utb: f64,
89 xp: f64,
90 yp: f64,
91) -> ErfaResult<[[f64; 3]; 3]> {
92 let rc2i = eraC2i00a_safe(tta, ttb)?;
93 let era = eraEra00_safe(uta, utb)?;
94 let sp = eraSp00_safe(tta, ttb)?;
95 let rpom = eraPom00_safe(xp, yp, sp)?;
96
97 let mut rc2t = [[0.0_f64; 3]; 3];
98 eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
99 Ok(rc2t)
100}
101
102pub fn eraC2t00b_safe(
104 tta: f64,
105 ttb: f64,
106 uta: f64,
107 utb: f64,
108 xp: f64,
109 yp: f64,
110) -> ErfaResult<[[f64; 3]; 3]> {
111 let rc2i = eraC2i00b_safe(tta, ttb)?;
112 let era = eraEra00_safe(uta, utb)?;
113 let rpom = eraPom00_safe(xp, yp, 0.0)?;
114
115 let mut rc2t = [[0.0_f64; 3]; 3];
116 eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
117 Ok(rc2t)
118}
119
120pub fn eraC2t06a_safe(
122 tta: f64,
123 ttb: f64,
124 uta: f64,
125 utb: f64,
126 xp: f64,
127 yp: f64,
128) -> ErfaResult<[[f64; 3]; 3]> {
129 let rc2i = eraC2i06a_safe(tta, ttb)?;
130 let era = eraEra00_safe(uta, utb)?;
131 let sp = eraSp00_safe(tta, ttb)?;
132 let rpom = eraPom00_safe(xp, yp, sp)?;
133
134 let mut rc2t = [[0.0_f64; 3]; 3];
135 eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
136 Ok(rc2t)
137}