libswe_sys/swerust/swe17/
handler.rs

1extern crate math;
2use crate::raw;
3use crate::sweconst::Signs;
4use math::round;
5use strum::IntoEnumIterator;
6// use std::ffi::{CStr, CString};
7// use std::os::raw::c_char;
8
9/*
10 * 17. Auxilliary functions
11 */
12pub fn degnorm(x: f64) -> f64 {
13    unsafe { raw::swe_degnorm(x) }
14}
15
16pub fn radnorm(x: f64) -> f64 {
17    unsafe { raw::swe_radnorm(x) }
18}
19
20#[derive(Debug, Clone)]
21pub struct SplitDegResult {
22    pub print: String,
23    pub deg: i32,
24    pub min: i32,
25    pub sec: i32,
26    pub cdegfr: f64,
27    //isgn: i32,
28    pub sign: Signs,
29    pub result: f64,
30}
31
32/// float to deg
33/// isgn return me always 0 ? I compute this value manualy
34pub fn split_deg(ddeg: f64, roundflag: i32) -> SplitDegResult {
35    // Convert deg to sign 30°
36    let sign_calc = round::floor(ddeg / 30.0, 0) as usize;
37    let house_calc = round::floor(ddeg / 30.0, 0);
38    let long_30 = (house_calc as f64 * 30.0) - ddeg;
39    // Call c library
40    let mut deg = [0; 1];
41    let mut min = [0; 1];
42    let mut sec = [0; 1];
43    let mut cdegfr = [0.0; 1];
44    let mut isgn = [0; 1];
45    let result: f64 = unsafe {
46        let p_deg = deg.as_mut_ptr();
47        let p_min = min.as_mut_ptr();
48        let p_sec = sec.as_mut_ptr();
49        let p_cdegfr = cdegfr.as_mut_ptr();
50        let p_isgn = isgn.as_mut_ptr();
51        raw::swe_split_deg(
52            long_30, roundflag, p_deg, p_min, p_sec, p_cdegfr, p_isgn,
53        )
54    };
55    let print = format!(
56        "{}{}{:02}{}{:02}",
57        i32::abs(deg[0]),
58        "°",
59        min[0],
60        "'",
61        sec[0],
62    );
63    SplitDegResult {
64        print,
65        deg: deg[0],
66        min: min[0],
67        sec: sec[0],
68        cdegfr: cdegfr[0],
69        // isgn: isgn[0],
70        sign: Signs::iter().nth(sign_calc).unwrap_or(Signs::Aries),
71        result,
72    }
73}