# ApsisRS Rust workspace root. # # The workspace resolves without any external dependency so that the # numerical kernels stay self-contained and auditable. Every member crate # is unpublished. # # ApsisRS Rust 工作区根。 # # 工作区在没有任何外部依赖的情况下解析,使各数值内核保持自包含且可 # 审计。每个成员 crate 都不发布。 [workspace] resolver = "2" members = [ # foundation / 基础层 "crates/foundation/apsis-core", "crates/foundation/apsis-units", "crates/foundation/apsis-math", "crates/foundation/apsis-macros", # physics / 物理层 "crates/physics/apsis-time", "crates/physics/apsis-leap", "crates/physics/apsis-coord", "crates/physics/apsis-geodesy", "crates/physics/apsis-frames", # orbit / 轨道层 "crates/orbit/apsis-tle", "crates/orbit/apsis-sgp4", "crates/orbit/apsis-kepler", "crates/orbit/apsis-ephemeris", "crates/orbit/apsis-maneuver", "crates/orbit/apsis-orbit", # rf / 射频层 "crates/rf/apsis-rf", "crates/rf/apsis-antenna", "crates/rf/apsis-doppler", "crates/rf/apsis-atmosphere", "crates/rf/apsis-noise", "crates/rf/apsis-interference", "crates/rf/apsis-link", # network / 网络层 "crates/network/apsis-constellation", "crates/network/apsis-coverage", "crates/network/apsis-access", "crates/network/apsis-topology", "crates/network/apsis-isl", "crates/network/apsis-routing", "crates/network/apsis-handover", "crates/network/apsis-mesh", # ops / 运行层 "crates/ops/apsis-resource", "crates/ops/apsis-task", "crates/ops/apsis-scheduler", "crates/ops/apsis-conflict", "crates/ops/apsis-schedule", # sim / 仿真层 "crates/sim/apsis-sim-engine", "crates/sim/apsis-scenario", "crates/sim/apsis-event", "crates/sim/apsis-output", "crates/sim/apsis-sim", # facade / 门面层 "crates/apsis-rs", ] [workspace.package] version = "0.1.0" edition = "2024" rust-version = "1.85" license = "GPL-3.0-or-later" authors = ["ApsisRS contributors"] [workspace.lints.rust] unsafe_code = "forbid" missing_docs = "deny" [workspace.lints.clippy] # The pedantic group is enabled, with the exceptions below. Each exception is # a property of the domain rather than a relaxation of care, so a change that # introduces a lint outside this list still fails the build. # 启用 pedantic 组,例外见下。每条例外都是领域属性而非放松要求,故引入不在 # 此列表中的 lint 仍会使构建失败。 pedantic = { level = "warn", priority = -1 } # The numeric kernels convert between an index or a count and a float, and # between signed and unsigned values, at points where the range is already # known, so the cast cannot lose information in practice. `as` is the idiom of # the domain and a `try_from` chain would obscure the arithmetic. # 数值内核在下标或计数与浮点数之间、以及有符号与无符号值之间转换,这些位置 # 的取值范围已知,故实践中不会丢失信息。`as` 是该领域的惯用法,而一串 # `try_from` 会使算式变得难读。 cast_precision_loss = "allow" cast_possible_truncation = "allow" cast_sign_loss = "allow" cast_possible_wrap = "allow" # Mathematical notation uses short and similar names, such as `theta` and # `theta_0`, and a long algorithm reads better in one piece than split. # 数学记号使用简短且相近的名称,如 `theta` 与 `theta_0`;长算法整体成篇比 # 拆开更易读。 similar_names = "allow" many_single_char_names = "allow" too_many_lines = "allow" # A test may compare two floats exactly when both sides are the same # expression evaluated twice, which is what a determinism test wants. # 当两侧是同一次表达式求值两次所得时,测试可以精确比较浮点数,这正是确定性 # 测试所需。 float_cmp = "allow" # The condition under which a function returns an error is stated in the doc # comment itself, as "Returns an error when ..." followed by its Chinese # counterpart, so the separate `# Errors` heading the lint wants would only # repeat that sentence. # 函数返回错误的条件已写在文档注释中,即 “Returns an error when ...” 及其中文 # 对应,故该 lint 要求的独立 `# Errors` 标题只会重复该句。 missing_errors_doc = "allow" # Numeric literals follow the grouping of the quantity they express, such as # the digits of a reference value, rather than a fixed width. The style lint # would force a regrouping that obscures the source of a value. # 数值字面量按其所表达量的分组来分隔,例如某参考值的各位数字,而非固定 # 宽度。风格 lint 会强制重新分组,从而模糊某值的来源。 inconsistent_digit_grouping = "allow" unreadable_literal = "allow" [workspace.dependencies] apsis-core = { path = "crates/foundation/apsis-core" } apsis-units = { path = "crates/foundation/apsis-units" } apsis-math = { path = "crates/foundation/apsis-math" } apsis-macros = { path = "crates/foundation/apsis-macros" } apsis-time = { path = "crates/physics/apsis-time" } apsis-leap = { path = "crates/physics/apsis-leap" } apsis-coord = { path = "crates/physics/apsis-coord" } apsis-geodesy = { path = "crates/physics/apsis-geodesy" } apsis-frames = { path = "crates/physics/apsis-frames" } apsis-tle = { path = "crates/orbit/apsis-tle" } apsis-sgp4 = { path = "crates/orbit/apsis-sgp4" } apsis-kepler = { path = "crates/orbit/apsis-kepler" } apsis-ephemeris = { path = "crates/orbit/apsis-ephemeris" } apsis-maneuver = { path = "crates/orbit/apsis-maneuver" } apsis-orbit = { path = "crates/orbit/apsis-orbit" } apsis-rf = { path = "crates/rf/apsis-rf" } apsis-antenna = { path = "crates/rf/apsis-antenna" } apsis-doppler = { path = "crates/rf/apsis-doppler" } apsis-atmosphere = { path = "crates/rf/apsis-atmosphere" } apsis-noise = { path = "crates/rf/apsis-noise" } apsis-interference = { path = "crates/rf/apsis-interference" } apsis-link = { path = "crates/rf/apsis-link" } apsis-constellation = { path = "crates/network/apsis-constellation" } apsis-coverage = { path = "crates/network/apsis-coverage" } apsis-access = { path = "crates/network/apsis-access" } apsis-topology = { path = "crates/network/apsis-topology" } apsis-isl = { path = "crates/network/apsis-isl" } apsis-routing = { path = "crates/network/apsis-routing" } apsis-handover = { path = "crates/network/apsis-handover" } apsis-mesh = { path = "crates/network/apsis-mesh" } apsis-resource = { path = "crates/ops/apsis-resource" } apsis-task = { path = "crates/ops/apsis-task" } apsis-scheduler = { path = "crates/ops/apsis-scheduler" } apsis-conflict = { path = "crates/ops/apsis-conflict" } apsis-schedule = { path = "crates/ops/apsis-schedule" } apsis-sim-engine = { path = "crates/sim/apsis-sim-engine" } apsis-scenario = { path = "crates/sim/apsis-scenario" } apsis-event = { path = "crates/sim/apsis-event" } apsis-output = { path = "crates/sim/apsis-output" } apsis-sim = { path = "crates/sim/apsis-sim" }