siderust-js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/.github/workflows/ci.yml +166 -0
  2. package/.gitmodules +9 -0
  3. package/CHANGELOG.md +26 -0
  4. package/LICENSE +661 -0
  5. package/README.md +138 -0
  6. package/package.json +12 -0
  7. package/qtty-js/.github/workflows/ci.yml +151 -0
  8. package/qtty-js/.gitmodules +3 -0
  9. package/qtty-js/CHANGELOG.md +31 -0
  10. package/qtty-js/LICENSE +661 -0
  11. package/qtty-js/README.md +132 -0
  12. package/qtty-js/package.json +20 -0
  13. package/qtty-js/qtty/.github/workflows/ci.yml +155 -0
  14. package/qtty-js/qtty/CHANGELOG.md +120 -0
  15. package/qtty-js/qtty/Cargo.lock +1462 -0
  16. package/qtty-js/qtty/Cargo.toml +12 -0
  17. package/qtty-js/qtty/LICENSE +661 -0
  18. package/qtty-js/qtty/README.md +9 -0
  19. package/qtty-js/qtty/qtty/Cargo.toml +41 -0
  20. package/qtty-js/qtty/qtty/README.md +8 -0
  21. package/qtty-js/qtty/qtty/examples/angles.rs +14 -0
  22. package/qtty-js/qtty/qtty/examples/astronomy.rs +17 -0
  23. package/qtty-js/qtty/qtty/examples/dimensional_arithmetic.rs +83 -0
  24. package/qtty-js/qtty/qtty/examples/python_integration.rs +61 -0
  25. package/qtty-js/qtty/qtty/examples/quickstart.rs +15 -0
  26. package/qtty-js/qtty/qtty/examples/ratios.rs +12 -0
  27. package/qtty-js/qtty/qtty/examples/serde_with_unit.rs +234 -0
  28. package/qtty-js/qtty/qtty/examples/serialization.rs +141 -0
  29. package/qtty-js/qtty/qtty/examples/serialization_advanced.rs +155 -0
  30. package/qtty-js/qtty/qtty/src/f32.rs +108 -0
  31. package/qtty-js/qtty/qtty/src/f64.rs +30 -0
  32. package/qtty-js/qtty/qtty/src/i128.rs +111 -0
  33. package/qtty-js/qtty/qtty/src/i16.rs +111 -0
  34. package/qtty-js/qtty/qtty/src/i32.rs +111 -0
  35. package/qtty-js/qtty/qtty/src/i64.rs +111 -0
  36. package/qtty-js/qtty/qtty/src/i8.rs +111 -0
  37. package/qtty-js/qtty/qtty/src/lib.rs +238 -0
  38. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std/Cargo.lock +83 -0
  39. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std/Cargo.toml +10 -0
  40. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std/src/lib.rs +7 -0
  41. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std-alloc/Cargo.lock +83 -0
  42. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std-alloc/Cargo.toml +10 -0
  43. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-no-std-alloc/src/lib.rs +7 -0
  44. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-std/Cargo.lock +83 -0
  45. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-std/Cargo.toml +10 -0
  46. package/qtty-js/qtty/qtty/tests/fixtures/qtty-vec-std/src/lib.rs +5 -0
  47. package/qtty-js/qtty/qtty/tests/integration_tests.rs +529 -0
  48. package/qtty-js/qtty/qtty/tests/qtty_vec_feature_matrix.rs +58 -0
  49. package/qtty-js/qtty/qtty-core/Cargo.toml +41 -0
  50. package/qtty-js/qtty/qtty-core/README.md +8 -0
  51. package/qtty-js/qtty/qtty-core/examples/diesel_integration.rs +145 -0
  52. package/qtty-js/qtty/qtty-core/examples/quantity_db_serde.rs +215 -0
  53. package/qtty-js/qtty/qtty-core/src/dimension.rs +249 -0
  54. package/qtty-js/qtty/qtty-core/src/feature_diesel.rs +318 -0
  55. package/qtty-js/qtty/qtty-core/src/feature_pyo3.rs +27 -0
  56. package/qtty-js/qtty/qtty-core/src/feature_serde.rs +203 -0
  57. package/qtty-js/qtty/qtty-core/src/feature_tiberius.rs +28 -0
  58. package/qtty-js/qtty/qtty-core/src/lib.rs +744 -0
  59. package/qtty-js/qtty/qtty-core/src/macros.rs +93 -0
  60. package/qtty-js/qtty/qtty-core/src/quantity.rs +810 -0
  61. package/qtty-js/qtty/qtty-core/src/scalar.rs +1742 -0
  62. package/qtty-js/qtty/qtty-core/src/unit.rs +332 -0
  63. package/qtty-js/qtty/qtty-core/src/units/angular.rs +1228 -0
  64. package/qtty-js/qtty/qtty-core/src/units/area.rs +243 -0
  65. package/qtty-js/qtty/qtty-core/src/units/frequency.rs +179 -0
  66. package/qtty-js/qtty/qtty-core/src/units/length.rs +1270 -0
  67. package/qtty-js/qtty/qtty-core/src/units/mass.rs +488 -0
  68. package/qtty-js/qtty/qtty-core/src/units/mod.rs +26 -0
  69. package/qtty-js/qtty/qtty-core/src/units/power.rs +324 -0
  70. package/qtty-js/qtty/qtty-core/src/units/time.rs +667 -0
  71. package/qtty-js/qtty/qtty-core/src/units/unitless.rs +212 -0
  72. package/qtty-js/qtty/qtty-core/src/units/velocity.rs +210 -0
  73. package/qtty-js/qtty/qtty-core/src/units/volume.rs +269 -0
  74. package/qtty-js/qtty/qtty-core/tests/core.rs +628 -0
  75. package/qtty-js/qtty/qtty-core/tests/diesel.rs +461 -0
  76. package/qtty-js/qtty/qtty-core/tests/integers.rs +632 -0
  77. package/qtty-js/qtty/qtty-core/tests/no_cross_unit_ops.rs +35 -0
  78. package/qtty-js/qtty/qtty-core/tests/pyo3.rs +334 -0
  79. package/qtty-js/qtty/qtty-core/tests/quantity_f32.rs +276 -0
  80. package/qtty-js/qtty/qtty-core/tests/scalar_decimal.rs +258 -0
  81. package/qtty-js/qtty/qtty-core/tests/scalar_f32.rs +286 -0
  82. package/qtty-js/qtty/qtty-core/tests/scalar_f64_real.rs +287 -0
  83. package/qtty-js/qtty/qtty-core/tests/scalar_rational.rs +260 -0
  84. package/qtty-js/qtty/qtty-core/tests/serde.rs +256 -0
  85. package/qtty-js/qtty/qtty-core/tests/tiberius.rs +208 -0
  86. package/qtty-js/qtty/qtty-derive/Cargo.toml +23 -0
  87. package/qtty-js/qtty/qtty-derive/README.md +8 -0
  88. package/qtty-js/qtty/qtty-derive/src/lib.rs +340 -0
  89. package/qtty-js/qtty/qtty-ffi/ARCHITECTURE.md +3 -0
  90. package/qtty-js/qtty/qtty-ffi/Cargo.toml +31 -0
  91. package/qtty-js/qtty/qtty-ffi/README.md +9 -0
  92. package/qtty-js/qtty/qtty-ffi/build.rs +326 -0
  93. package/qtty-js/qtty/qtty-ffi/cbindgen.toml +105 -0
  94. package/qtty-js/qtty/qtty-ffi/include/qtty_ffi.h +1126 -0
  95. package/qtty-js/qtty/qtty-ffi/src/ffi.rs +1251 -0
  96. package/qtty-js/qtty/qtty-ffi/src/ffi_serde.rs +294 -0
  97. package/qtty-js/qtty/qtty-ffi/src/helpers.rs +310 -0
  98. package/qtty-js/qtty/qtty-ffi/src/lib.rs +229 -0
  99. package/qtty-js/qtty/qtty-ffi/src/macros.rs +121 -0
  100. package/qtty-js/qtty/qtty-ffi/src/registry.rs +274 -0
  101. package/qtty-js/qtty/qtty-ffi/src/types.rs +620 -0
  102. package/qtty-js/qtty/qtty-ffi/tests/integration_tests.rs +842 -0
  103. package/qtty-js/qtty/qtty-ffi/units.csv +156 -0
  104. package/qtty-js/qtty/qtty-ffi/units.csv.md +3 -0
  105. package/qtty-js/qtty-node/.prettierignore +6 -0
  106. package/qtty-js/qtty-node/.prettierrc.json +6 -0
  107. package/qtty-js/qtty-node/README.md +250 -0
  108. package/qtty-js/qtty-node/c8.config.json +11 -0
  109. package/qtty-js/qtty-node/eslint.config.js +31 -0
  110. package/qtty-js/qtty-node/examples/arithmetic.mjs +64 -0
  111. package/qtty-js/qtty-node/examples/astronomy.mjs +90 -0
  112. package/qtty-js/qtty-node/examples/quickstart.mjs +36 -0
  113. package/qtty-js/qtty-node/examples/serialization.mjs +125 -0
  114. package/qtty-js/qtty-node/examples/unit_factories.mjs +74 -0
  115. package/qtty-js/qtty-node/index.d.ts +219 -0
  116. package/qtty-js/qtty-node/index.js +323 -0
  117. package/qtty-js/qtty-node/lib/DerivedQuantity.js +122 -0
  118. package/qtty-js/qtty-node/lib/Quantity.js +151 -0
  119. package/qtty-js/qtty-node/lib/backend.js +25 -0
  120. package/qtty-js/qtty-node/native.cjs +306 -0
  121. package/qtty-js/qtty-node/package-lock.json +3223 -0
  122. package/qtty-js/qtty-node/package.json +70 -0
  123. package/qtty-js/qtty-node/units.d.ts +299 -0
  124. package/qtty-js/qtty-node/units.js +210 -0
  125. package/qtty-js/qtty-web/Cargo.lock +767 -0
  126. package/qtty-js/qtty-web/Cargo.toml +21 -0
  127. package/qtty-js/qtty-web/index.d.ts +140 -0
  128. package/qtty-js/qtty-web/index.js +20 -0
  129. package/qtty-js/qtty-web/lib/DerivedQuantity.js +58 -0
  130. package/qtty-js/qtty-web/lib/Quantity.js +75 -0
  131. package/qtty-js/qtty-web/lib/backend.js +80 -0
  132. package/qtty-js/qtty-web/package.json +45 -0
  133. package/qtty-js/qtty-web/src/lib.rs +111 -0
  134. package/qtty-js/scripts/ci.sh +73 -0
  135. package/scripts/ci.sh +123 -0
  136. package/siderust-core/Cargo.lock +787 -0
  137. package/siderust-core/Cargo.toml +18 -0
  138. package/siderust-core/DEDUPLICATION.md +124 -0
  139. package/siderust-core/src/body.rs +120 -0
  140. package/siderust-core/src/events.rs +184 -0
  141. package/siderust-core/src/lib.rs +20 -0
  142. package/siderust-core/src/observer.rs +55 -0
  143. package/siderust-core/src/position.rs +213 -0
  144. package/siderust-node/.prettierignore +7 -0
  145. package/siderust-node/.prettierrc.json +6 -0
  146. package/siderust-node/Cargo.lock +906 -0
  147. package/siderust-node/Cargo.toml +29 -0
  148. package/siderust-node/README.md +109 -0
  149. package/siderust-node/__test__/index.test.mjs +248 -0
  150. package/siderust-node/build.rs +5 -0
  151. package/siderust-node/c8.config.json +3 -0
  152. package/siderust-node/eslint.config.js +31 -0
  153. package/siderust-node/examples/01_basic_coordinates.mjs +24 -0
  154. package/siderust-node/examples/02_coordinate_transformations.mjs +25 -0
  155. package/siderust-node/examples/03_all_frames_conversions.mjs +26 -0
  156. package/siderust-node/examples/04_all_center_conversions.mjs +24 -0
  157. package/siderust-node/examples/05_target_tracking.mjs +22 -0
  158. package/siderust-node/examples/06_night_events.mjs +18 -0
  159. package/siderust-node/examples/07_moon_properties.mjs +21 -0
  160. package/siderust-node/examples/08_solar_system.mjs +19 -0
  161. package/siderust-node/examples/09_star_observability.mjs +22 -0
  162. package/siderust-node/examples/10_time_periods.mjs +9 -0
  163. package/siderust-node/examples/11_serialization.mjs +31 -0
  164. package/siderust-node/examples/12_runtime_ephemeris.mjs +27 -0
  165. package/siderust-node/examples/13_coordinate_operations.mjs +20 -0
  166. package/siderust-node/index.d.ts +623 -0
  167. package/siderust-node/index.js +79 -0
  168. package/siderust-node/lib/Observer.js +112 -0
  169. package/siderust-node/lib/Star.js +118 -0
  170. package/siderust-node/lib/backend.js +63 -0
  171. package/siderust-node/lib/wrappers.js +566 -0
  172. package/siderust-node/main.js +20 -0
  173. package/siderust-node/native.cjs +360 -0
  174. package/siderust-node/package-lock.json +3261 -0
  175. package/siderust-node/package.json +71 -0
  176. package/siderust-node/src/body.rs +74 -0
  177. package/siderust-node/src/coordinates.rs +372 -0
  178. package/siderust-node/src/ephemeris.rs +462 -0
  179. package/siderust-node/src/events.rs +577 -0
  180. package/siderust-node/src/lib.rs +43 -0
  181. package/siderust-node/src/observer.rs +132 -0
  182. package/siderust-node/src/phase.rs +218 -0
  183. package/siderust-node/src/position.rs +292 -0
  184. package/siderust-node/src/star.rs +200 -0
  185. package/siderust-web/Cargo.lock +855 -0
  186. package/siderust-web/Cargo.toml +34 -0
  187. package/siderust-web/README.md +100 -0
  188. package/siderust-web/__test__/index.test.mjs +118 -0
  189. package/siderust-web/examples/github-pages/README.md +31 -0
  190. package/siderust-web/examples/github-pages/index.html +135 -0
  191. package/siderust-web/index.d.ts +311 -0
  192. package/siderust-web/index.js +66 -0
  193. package/siderust-web/lib/Observer.js +103 -0
  194. package/siderust-web/lib/Star.js +116 -0
  195. package/siderust-web/lib/backend.js +400 -0
  196. package/siderust-web/lib/wrappers.js +512 -0
  197. package/siderust-web/package.json +55 -0
  198. package/siderust-web/src/body.rs +69 -0
  199. package/siderust-web/src/coordinates.rs +302 -0
  200. package/siderust-web/src/ephemeris.rs +456 -0
  201. package/siderust-web/src/events.rs +520 -0
  202. package/siderust-web/src/lib.rs +51 -0
  203. package/siderust-web/src/observer.rs +117 -0
  204. package/siderust-web/src/phase.rs +190 -0
  205. package/siderust-web/src/position.rs +291 -0
  206. package/siderust-web/src/star.rs +178 -0
  207. package/tempoch-js/.github/workflows/ci.yml +142 -0
  208. package/tempoch-js/.gitmodules +3 -0
  209. package/tempoch-js/CHANGELOG.md +25 -0
  210. package/tempoch-js/LICENSE +661 -0
  211. package/tempoch-js/README.md +126 -0
  212. package/tempoch-js/package.json +20 -0
  213. package/tempoch-js/scripts/ci.sh +73 -0
  214. package/tempoch-js/tempoch/.github/workflows/ci.yml +113 -0
  215. package/tempoch-js/tempoch/CHANGELOG.md +82 -0
  216. package/tempoch-js/tempoch/Cargo.lock +947 -0
  217. package/tempoch-js/tempoch/Cargo.toml +3 -0
  218. package/tempoch-js/tempoch/LICENSE +661 -0
  219. package/tempoch-js/tempoch/README.md +76 -0
  220. package/tempoch-js/tempoch/tempoch/Cargo.toml +27 -0
  221. package/tempoch-js/tempoch/tempoch/examples/periods.rs +45 -0
  222. package/tempoch-js/tempoch/tempoch/examples/quickstart.rs +13 -0
  223. package/tempoch-js/tempoch/tempoch/src/lib.rs +49 -0
  224. package/tempoch-js/tempoch/tempoch/tests/integration.rs +57 -0
  225. package/tempoch-js/tempoch/tempoch-core/Cargo.toml +24 -0
  226. package/tempoch-js/tempoch/tempoch-core/src/delta_t.rs +345 -0
  227. package/tempoch-js/tempoch/tempoch-core/src/instant.rs +811 -0
  228. package/tempoch-js/tempoch/tempoch-core/src/julian_date_ext.rs +142 -0
  229. package/tempoch-js/tempoch/tempoch-core/src/lib.rs +81 -0
  230. package/tempoch-js/tempoch/tempoch-core/src/period.rs +1168 -0
  231. package/tempoch-js/tempoch/tempoch-core/src/scales.rs +779 -0
  232. package/tempoch-js/tempoch/tempoch-ffi/Cargo.lock +889 -0
  233. package/tempoch-js/tempoch/tempoch-ffi/Cargo.toml +26 -0
  234. package/tempoch-js/tempoch/tempoch-ffi/build.rs +24 -0
  235. package/tempoch-js/tempoch/tempoch-ffi/cbindgen.toml +30 -0
  236. package/tempoch-js/tempoch/tempoch-ffi/src/error.rs +19 -0
  237. package/tempoch-js/tempoch/tempoch-ffi/src/lib.rs +82 -0
  238. package/tempoch-js/tempoch/tempoch-ffi/src/period.rs +101 -0
  239. package/tempoch-js/tempoch/tempoch-ffi/src/time.rs +711 -0
  240. package/tempoch-js/tempoch/tempoch-ffi/tests/ffi.rs +265 -0
  241. package/tempoch-js/tempoch-node/.prettierignore +6 -0
  242. package/tempoch-js/tempoch-node/.prettierrc.json +6 -0
  243. package/tempoch-js/tempoch-node/Cargo.lock +496 -0
  244. package/tempoch-js/tempoch-node/Cargo.toml +29 -0
  245. package/tempoch-js/tempoch-node/README.md +265 -0
  246. package/tempoch-js/tempoch-node/__test__/index.test.mjs +598 -0
  247. package/tempoch-js/tempoch-node/build.rs +5 -0
  248. package/tempoch-js/tempoch-node/c8.config.json +3 -0
  249. package/tempoch-js/tempoch-node/eslint.config.js +31 -0
  250. package/tempoch-js/tempoch-node/examples/periods.mjs +79 -0
  251. package/tempoch-js/tempoch-node/examples/quickstart.mjs +71 -0
  252. package/tempoch-js/tempoch-node/examples/timescales.mjs +92 -0
  253. package/tempoch-js/tempoch-node/index.d.ts +280 -0
  254. package/tempoch-js/tempoch-node/index.js +32 -0
  255. package/tempoch-js/tempoch-node/lib/JulianDate.js +176 -0
  256. package/tempoch-js/tempoch-node/lib/ModifiedJulianDate.js +156 -0
  257. package/tempoch-js/tempoch-node/lib/Period.js +133 -0
  258. package/tempoch-js/tempoch-node/lib/backend.js +38 -0
  259. package/tempoch-js/tempoch-node/lib/qttyCompat.js +92 -0
  260. package/tempoch-js/tempoch-node/native.cjs +317 -0
  261. package/tempoch-js/tempoch-node/package-lock.json +3223 -0
  262. package/tempoch-js/tempoch-node/package.json +56 -0
  263. package/tempoch-js/tempoch-node/src/lib.rs +573 -0
  264. package/tempoch-js/tempoch-web/Cargo.toml +23 -0
  265. package/tempoch-js/tempoch-web/index.d.ts +95 -0
  266. package/tempoch-js/tempoch-web/index.js +27 -0
  267. package/tempoch-js/tempoch-web/lib/JulianDate.js +170 -0
  268. package/tempoch-js/tempoch-web/lib/ModifiedJulianDate.js +145 -0
  269. package/tempoch-js/tempoch-web/lib/Period.js +121 -0
  270. package/tempoch-js/tempoch-web/lib/backend.js +118 -0
  271. package/tempoch-js/tempoch-web/package.json +46 -0
  272. package/tempoch-js/tempoch-web/src/lib.rs +184 -0
@@ -0,0 +1,26 @@
1
+ [package]
2
+ name = "tempoch-ffi"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ authors = ["VPRamon <vallespuigramon@gmail.com>"]
6
+ description = "C FFI bindings for tempoch — astronomical time primitives."
7
+ license = "AGPL-3.0-only"
8
+ repository = "https://github.com/Siderust/tempoch"
9
+
10
+ [lib]
11
+ name = "tempoch_ffi"
12
+ crate-type = ["cdylib", "staticlib", "rlib"]
13
+
14
+ [features]
15
+ default = []
16
+ serde = ["tempoch/serde", "dep:serde_json"]
17
+
18
+ [dependencies]
19
+ tempoch = { path = "../tempoch", version = "0.3.0" }
20
+ qtty = "0.4.0"
21
+ qtty-ffi = "0.3.1"
22
+ chrono = "0.4.44"
23
+ serde_json = { version = "1.0", optional = true }
24
+
25
+ [build-dependencies]
26
+ cbindgen = "0.29.2"
@@ -0,0 +1,24 @@
1
+ use std::env;
2
+ use std::path::PathBuf;
3
+
4
+ fn main() {
5
+ let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
6
+ let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
7
+ let include_dir = PathBuf::from(&crate_dir).join("include");
8
+
9
+ let config =
10
+ cbindgen::Config::from_file("cbindgen.toml").expect("Unable to read cbindgen.toml");
11
+
12
+ let bindings = cbindgen::Builder::new()
13
+ .with_crate(&crate_dir)
14
+ .with_config(config)
15
+ .generate()
16
+ .expect("Unable to generate C bindings");
17
+
18
+ // Write to OUT_DIR (standard cargo location)
19
+ bindings.write_to_file(out_dir.join("tempoch_ffi.h"));
20
+
21
+ // Also write to include/ for easy consumption by C/C++ projects
22
+ std::fs::create_dir_all(&include_dir).expect("Unable to create include directory");
23
+ bindings.write_to_file(include_dir.join("tempoch_ffi.h"));
24
+ }
@@ -0,0 +1,30 @@
1
+ language = "C"
2
+ include_guard = "TEMPOCH_FFI_H"
3
+ autogen_warning = "/* Warning: this file is auto-generated by cbindgen. Do not modify manually. */"
4
+ documentation_style = "c99"
5
+ style = "both"
6
+ cpp_compat = true
7
+ after_includes = """
8
+ /* QttyQuantity and UnitId definitions come from qtty_ffi.h */
9
+ #include "qtty_ffi.h"
10
+ """
11
+
12
+ [defines]
13
+ "feature = serde" = "TEMPOCH_FFI_HAS_SERDE"
14
+
15
+ [export]
16
+ # Exclude qtty-ffi types — they come from qtty_ffi.h (included via after_includes)
17
+ exclude = ["QttyQuantity", "UnitId", "DimensionId", "QttyDerivedQuantity"]
18
+
19
+ [export.rename]
20
+ "TempochStatus" = "tempoch_status_t"
21
+ "TempochUtc" = "tempoch_utc_t"
22
+ "TempochPeriodMjd" = "tempoch_period_mjd_t"
23
+ "QttyQuantity" = "qtty_quantity_t"
24
+
25
+ [enum]
26
+ rename_variants = "ScreamingSnakeCase"
27
+ prefix_with_name = true
28
+
29
+ [fn]
30
+ prefix = ""
@@ -0,0 +1,19 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+
3
+ /// Status codes returned by tempoch-ffi functions.
4
+ ///
5
+ /// cbindgen:prefix-with-name
6
+ #[repr(i32)]
7
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
8
+ pub enum TempochStatus {
9
+ /// Success.
10
+ Ok = 0,
11
+ /// A required output pointer was null.
12
+ NullPointer = 1,
13
+ /// UTC conversion failed (date out of range or invalid).
14
+ UtcConversionFailed = 2,
15
+ /// The period is invalid (start > end).
16
+ InvalidPeriod = 3,
17
+ /// The two periods do not intersect.
18
+ NoIntersection = 4,
19
+ }
@@ -0,0 +1,82 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Vallés Puig, Ramon
3
+
4
+ //! C FFI bindings for **tempoch** — astronomical time primitives.
5
+ //!
6
+ //! This crate exposes a flat C-compatible API for creating and manipulating
7
+ //! Julian Dates, Modified Julian Dates, time periods, and UTC conversions.
8
+ //!
9
+ //! Duration-related functions return [`QttyQuantity`] from qtty-ffi, providing
10
+ //! type-safe unit information alongside numeric values.
11
+
12
+ #![deny(missing_docs)]
13
+ #![deny(unsafe_op_in_unsafe_fn)]
14
+
15
+ mod error;
16
+ mod period;
17
+ mod time;
18
+
19
+ pub use error::*;
20
+ pub use period::*;
21
+ pub use time::*;
22
+
23
+ // Re-export qtty-ffi types used in our public FFI surface
24
+ pub use qtty_ffi::{QttyQuantity, UnitId};
25
+
26
+ /// Catches any panic and returns an error value instead of unwinding across FFI.
27
+ macro_rules! catch_panic {
28
+ ($default:expr, $body:expr) => {{
29
+ match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| $body)) {
30
+ Ok(result) => result,
31
+ Err(_) => $default,
32
+ }
33
+ }};
34
+ }
35
+ pub(crate) use catch_panic;
36
+
37
+ /// Returns the tempoch-ffi ABI version (semver-encoded: major*10000 + minor*100 + patch).
38
+ #[allow(clippy::erasing_op, clippy::identity_op)]
39
+ #[no_mangle]
40
+ pub extern "C" fn tempoch_ffi_version() -> u32 {
41
+ 0 * 10000 + 1 * 100 + 0 // 0.1.0
42
+ }
43
+
44
+ #[cfg(test)]
45
+ mod tests {
46
+ use super::*;
47
+
48
+ #[test]
49
+ fn version_returns_expected_value() {
50
+ assert_eq!(tempoch_ffi_version(), 100);
51
+ }
52
+
53
+ // ── Layout tests ─────────────────────────────────────────────────
54
+ // These tests guard ABI stability by asserting exact sizes and
55
+ // alignments of every `#[repr(C)]`/`#[repr(i32)]` type.
56
+
57
+ #[test]
58
+ fn layout_tempoch_status() {
59
+ assert_eq!(std::mem::size_of::<TempochStatus>(), 4);
60
+ assert_eq!(std::mem::align_of::<TempochStatus>(), 4);
61
+ }
62
+
63
+ #[test]
64
+ fn layout_tempoch_scale() {
65
+ assert_eq!(std::mem::size_of::<TempochScale>(), 4);
66
+ assert_eq!(std::mem::align_of::<TempochScale>(), 4);
67
+ }
68
+
69
+ #[test]
70
+ fn layout_tempoch_utc() {
71
+ // i32 + u8*5 + padding + u32 = 16 with C repr packing
72
+ assert_eq!(std::mem::size_of::<TempochUtc>(), 16);
73
+ assert_eq!(std::mem::align_of::<TempochUtc>(), 4);
74
+ }
75
+
76
+ #[test]
77
+ fn layout_tempoch_period_mjd() {
78
+ // Two f64 fields → 16 bytes, 8-aligned
79
+ assert_eq!(std::mem::size_of::<TempochPeriodMjd>(), 16);
80
+ assert_eq!(std::mem::align_of::<TempochPeriodMjd>(), 8);
81
+ }
82
+ }
@@ -0,0 +1,101 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Vallés Puig, Ramon
3
+
4
+ //! FFI bindings for tempoch period/interval types.
5
+
6
+ use crate::catch_panic;
7
+ use crate::error::TempochStatus;
8
+ use tempoch::{Interval, ModifiedJulianDate, Period, MJD};
9
+
10
+ // ═══════════════════════════════════════════════════════════════════════════
11
+ // C-repr types
12
+ // ═══════════════════════════════════════════════════════════════════════════
13
+
14
+ /// A time period in Modified Julian Date, suitable for C interop.
15
+ #[repr(C)]
16
+ #[derive(Debug, Clone, Copy)]
17
+ pub struct TempochPeriodMjd {
18
+ /// Start of the period (MJD).
19
+ pub start_mjd: f64,
20
+ /// End of the period (MJD).
21
+ pub end_mjd: f64,
22
+ }
23
+
24
+ impl TempochPeriodMjd {
25
+ /// Convert from Rust `Period<MJD>` to the C-repr struct.
26
+ pub fn from_period(p: &Period<MJD>) -> Self {
27
+ Self {
28
+ start_mjd: p.start.value(),
29
+ end_mjd: p.end.value(),
30
+ }
31
+ }
32
+
33
+ /// Convert to Rust `Period<MJD>`.
34
+ pub fn to_period(&self) -> Period<MJD> {
35
+ Interval::new(
36
+ ModifiedJulianDate::new(self.start_mjd),
37
+ ModifiedJulianDate::new(self.end_mjd),
38
+ )
39
+ }
40
+ }
41
+
42
+ // ═══════════════════════════════════════════════════════════════════════════
43
+ // Period functions
44
+ // ═══════════════════════════════════════════════════════════════════════════
45
+
46
+ /// Create a new MJD period. Returns InvalidPeriod if start > end.
47
+ ///
48
+ /// # Safety
49
+ /// `out` must be a valid, writable pointer to `TempochPeriodMjd`.
50
+ #[no_mangle]
51
+ pub unsafe extern "C" fn tempoch_period_mjd_new(
52
+ start_mjd: f64,
53
+ end_mjd: f64,
54
+ out: *mut TempochPeriodMjd,
55
+ ) -> TempochStatus {
56
+ catch_panic!(TempochStatus::InvalidPeriod, {
57
+ if out.is_null() {
58
+ return TempochStatus::NullPointer;
59
+ }
60
+ if start_mjd > end_mjd {
61
+ return TempochStatus::InvalidPeriod;
62
+ }
63
+ unsafe {
64
+ *out = TempochPeriodMjd { start_mjd, end_mjd };
65
+ }
66
+ TempochStatus::Ok
67
+ })
68
+ }
69
+
70
+ /// Compute the duration of a period in days.
71
+ #[no_mangle]
72
+ pub extern "C" fn tempoch_period_mjd_duration_days(period: TempochPeriodMjd) -> f64 {
73
+ period.end_mjd - period.start_mjd
74
+ }
75
+
76
+ /// Compute the intersection of two periods.
77
+ /// Returns NoIntersection if they don't overlap, Ok if `out` is filled.
78
+ ///
79
+ /// # Safety
80
+ /// `out` must be a valid, writable pointer to `TempochPeriodMjd`.
81
+ #[no_mangle]
82
+ pub unsafe extern "C" fn tempoch_period_mjd_intersection(
83
+ a: TempochPeriodMjd,
84
+ b: TempochPeriodMjd,
85
+ out: *mut TempochPeriodMjd,
86
+ ) -> TempochStatus {
87
+ catch_panic!(TempochStatus::NoIntersection, {
88
+ if out.is_null() {
89
+ return TempochStatus::NullPointer;
90
+ }
91
+ let pa = a.to_period();
92
+ let pb = b.to_period();
93
+ match pa.intersection(&pb) {
94
+ Some(result) => {
95
+ unsafe { *out = TempochPeriodMjd::from_period(&result) };
96
+ TempochStatus::Ok
97
+ }
98
+ None => TempochStatus::NoIntersection,
99
+ }
100
+ })
101
+ }