2个版本

0.1.1 2024年8月3日
0.1.0 2024年8月2日

#52 in 地理空间

Download history 194/week @ 2024-07-29 28/week @ 2024-08-05

222 每月下载量

AGPL-3.0-only

81KB
1.5K SLoC

swisseph_rs

非官方的swisseph_rs实现了围绕Swiss Ephemeris C库的高级Rust包装和类型。目标是根据调用者的需求提供多个不同级别的抽象。

WIP:此项目正在建设中,接口不应被视为最终版本!

待办事项

  • 许多功能仍需实现。
  • 示例USA世俗计算存在轻微差异。差几分钟
  • 提供构建器,使用标志进行一些合理性检查
  • 提供一种方式,以支持数组指针的指针,以实现数据结构的有效重用,同时也允许在函数调用中创建结构,这些调用返回新的结构。

抽象级别

待办事项:明确确定每一层将做什么

以下是对不同层的初步草图:

  • raw -> c类型直接来自bindgen。参见libswisseph-sys_rs
  • 第1级 -> rust类型调用c中的函数
  • 第2级 -> rust类型调用rust中的函数
  • 第3级 -> rust类型具有rust易用性,使用Result和具有冗长代码的东西
  • 第4级 -> 使用Result的最简洁Rust代码的Rust易用性
  • 第5级 -> 高级接口

原始(libswisseph-sys_rs

作为解释,原始bindgen函数需要unsafe块,并将原始可变指针传递给函数。所有传入的参数都应完全初始化,并将修改函数之外的数据。这允许通过允许用户以任何方式重用初始化的数组来提供可能的最大性能,并且不会为每个调用创建新数组。然而,这要求用户知道确切的数据类型(不同大小和类型的数组)以及知道返回数据的每个索引的含义。许多数组返回多个浮点数,没有比索引识别它们更多的东西,而不是结构或具有字符串标识符的散列。

原始包装器还可能使用对典型Rust开发者来说不太直观的尴尬数据类型。

第1级(改进的C)

本级的目的是仅仅清理任何c继承的尴尬之处,但仍然要求最终用户知道正确初始化数据的方式,并依赖于函数将修改函数本身作用域之外的数据的指针。

依赖项

~2.7–5MB
~103K SLoC