#ephemeris #astrology #zodiac #astronomy

sys libswisseph-sys

Rust 对 swisseph C 库的系统封装

3 个版本

0.1.2 2024年8月10日
0.1.1 2024年8月2日
0.1.0 2024年7月27日

#186 in 地理空间

Download history 182/week @ 2024-07-27 55/week @ 2024-08-03 115/week @ 2024-08-10

每月352次下载
swisseph 中使用

AGPL-3.0-only

2MB
36K SLoC

C 33K SLoC // 0.2% comments Rust 2K SLoC // 0.4% comments M4 382 SLoC // 0.0% comments Perl 134 SLoC // 0.3% comments Shell 70 SLoC // 0.1% comments GDB Script 4 SLoC GNU Style Assembly 3 SLoC

libswisseph-sys

Rust 对 swisseph C 库的系统封装

用法

默认情况下,主 pub 导出将是原始 bindgen 生成的文件。这些绑定要求用户知道函数期望的类型,因为许多函数接受不同大小数组的指针。

use libswisseph_sys::*;

TODO:进行中

还包括一个 tuple_result 模块,它提供了所有返回数据都由函数本身创建和返回的功能。错误代码也进行了检查,整个计算都被封装在 Result 类型中,以便 Rust 用户可以执行标准检查 Ok 或 Err。

use libswisseph_sys::tuple_result::*;

天文历文件

天文历文件被排除在这个crate之外,以便它适合crates.io。在swisseph C库中存在标准的天文历文件,根据所需的计算,还可以包括更多。例如:小行星、JPL等。

默认的天文历路径可以根据 swisseph C 库中描述的方式进行设置。有关更多详细信息,请参阅 https://github.com/aloistr/swisseph/

示例用法

use libswisseph_sys::*;
let mut xx: [f64; 6] = [0.0; 6];
let mut serr = [0; 256];

let y = 2002;
let m = 1;
let d = 1;
let h = 0.0;
let i_flag = SE_GREG_CAL as i32;

let tjd_ut = swe_julday(y, m, d, h, i_flag);
let ipl = SE_SUN as i32;
swe_calc_ut(
    tjd_ut, 
    ipl, 
    SEFLG_SPEED as i32, 
    xx.as_mut_ptr(), 
    serr.as_mut_ptr(),
);

let _lng = xx[0];
let _lat = xx[1];
let _speed = xx[3];

TODO

  • 检查 bindgen 是否可以生成更易于使用的整数类型。函数和常量之间存在一些有符号和无符号类型的差异。例如,SE_ERR 是 -1,它生成一个 i32,但 SE_OK 是 0,因此生成一个 u32。

swisseph 文档

https://www.astro.com/swisseph/swephprg.htm https://www.astro.com/ftp/swisseph/doc/swisseph.pdf

致谢

  • Astrodienst / @aloistr 对 swisseph 的贡献
  • Stéphane Bressani / @stephaneworkspace 对他的封装和 Rust 项目的贡献

备注

u128 警告

Rustc u128 不是 ffi 安全的。任何引用 u128 的函数都被忽略,以防止编译错误。

添加了 swisseph c 库作为子模块

git submodule add https://github.com/aloistr/swisseph.git libswisseph/

不包括的函数

瑞士星历提供了一些未在头文件中引用的功能,因此将不包括在内。一些文件包含主函数,例如swevents进行事件计算并将结果输出到本地文件。

swedates存在重叠类型导致错误,因此未包含在内。

依赖项