- src/difflib.rs: faithful port of CPython difflib.SequenceMatcher (Ratcliff/Obershelp ratio incl. real_quick_ratio/quick_ratio and autojunk), validated against python-computed test vectors with exact float equality - data/warhammer_data.json: taxonomy tables dumped from the python module (tools/dump_warhammer_data.py), parsed order-preserving in src/warhammer_data.rs (python dict insert-order + last-value-wins semantics) - deps for the module ports: clap, reqwest, url, base64, regex, sha2, hex, sevenz-rust2, unrar, zip, indexmap, rand, rpassword
version-rust
Rust rewrite of version-python (same repo, main branch still carries the
flat python layout). Goal: one concise binary + webapp, eventually replacing
the python tooling.
Why this structure
mainstays untouched (flat python layout) until the rewrite reaches parity.- This branch re-homes the python code into
version-python/(viagit mv, history preserved) and startsversion-rust/beside it. version-python/AGENTS.mdstill documents the python stage — its rules (secrets, failure policy, idempotency, rate limiting) apply to the rewrite too and are the contract the Rust version must keep.
Planned crate choices (initial, adjust as modules get ported)
| Concern | Python today | Rust plan |
|---|---|---|
| 7z extraction | 7z CLI, cp437 name repair, /var/tmp fallback | sevenz-rust2 (pure Rust; LZMA/LZMA2/PPMD/AES-256 decrypt, v0.23, active) |
| zip extraction | 7z CLI | zip crate |
| RAR extraction (critical) | 7z CLI | unrar.rs (muja/unrar.rs — bindings to the official UnRAR library, RAR5 support, extraction only). Note: UnRAR license is freeware-not-OSI and forbids building a RAR compressor — acceptable, we only extract, and compression later is 7z-only (sevenz-rust2 ArchiveWriter) anyway |
| HTTP client | requests |
reqwest (blocking first, async where the webapp needs it) |
| sha256 (gofile website token, --hash manifest) | hashlib | sha2 |
| Fuzzy matching (sorter) | difflib-style ratios | strsim — port thresholds exactly, add unit tests |
| CLI | argparse | clap |
| Webapp | — | axum (CLI parity first, webapp second) |
| Discord export | DCE docker container (external) | unchanged: shell out to docker |
Port order (suggested)
state/globalstore/ manifest — done, seesrc/state.rs,src/globalstore.rs,src/manifest.rs(schemas backward compatible).- hosters:
gofile(one guest account per run!),zero807(UA + Referer). - extraction + manifest appender.
- catalogue / sorter (hardest logic; port the matching rules documented in
version-python/AGENTS.md§7 with tests). - webapp on top.