chore(rust): drop easily-inlined deps (anyhow, bytes, byteorder, num_cpus)

- anyhow: unused
- bytes: only a reqwest return-type annotation
- byteorder: replaced with std's from_le_bytes + try_into
- num_cpus: replaced with std:🧵:available_parallelism (stable 1.59)

No behavior change; 133 tests + clippy green.
This commit is contained in:
Graham McIntire 2026-04-24 12:13:20 -05:00
parent a5f76896d0
commit 98aab767d0
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59
7 changed files with 35 additions and 46 deletions

View file

@ -695,12 +695,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
[[package]]
name = "hex"
version = "0.4.3"
@ -1266,16 +1260,6 @@ dependencies = [
"libm",
]
[[package]]
name = "num_cpus"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "once_cell"
version = "1.21.4"
@ -1449,14 +1433,10 @@ dependencies = [
name = "prop_grid_rs"
version = "0.1.0"
dependencies = [
"anyhow",
"axum",
"byteorder",
"bytes",
"chrono",
"flate2",
"futures",
"num_cpus",
"png",
"pretty_assertions",
"prometheus",

View file

@ -20,8 +20,6 @@ path = "src/bin/hrrr_point_worker.rs"
tokio = { version = "1", features = ["full"] }
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres", "uuid", "chrono", "macros", "json"] }
reqwest = { version = "0.13", features = ["rustls", "stream"], default-features = false }
bytes = "1"
anyhow = "1"
thiserror = "2"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
@ -29,8 +27,6 @@ chrono = { version = "0.4", features = ["serde"] }
uuid = { version = "1", features = ["v4", "serde"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
num_cpus = "1"
byteorder = "1"
futures = "0.3"
rayon = "1.12"
axum = { version = "0.8", default-features = false, features = ["http1", "tokio"] }

View file

@ -47,7 +47,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let parallelism: usize = std::env::var("PROP_GRID_RS_PARALLELISM")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or_else(num_cpus::get)
.unwrap_or_else(|| {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1)
})
.max(1);
// +2 slots over parallelism: each worker holds one connection during
// claim/complete transactions; the spare lets NOTIFY and an opportunistic

View file

@ -15,8 +15,6 @@ use std::process::{Command, Output};
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
use byteorder::{ByteOrder, LittleEndian};
use crate::grid::{round3, GridSpec};
const UNDEFINED_VALUE: f32 = 9.999e20;
@ -244,7 +242,9 @@ pub fn parse_lola_binary(bin: &[u8], messages: &[Message], grid_spec: &GridSpec)
let lat_key = (lat * 1000.0).round() as i32;
for i in 0..nx {
let cell_offset = (j * nx + i) * 4;
let value = LittleEndian::read_f32(&chunk[cell_offset..cell_offset + 4]);
let value = f32::from_le_bytes(
chunk[cell_offset..cell_offset + 4].try_into().unwrap(),
);
if value > UNDEFINED_VALUE / 2.0 {
continue;
}

View file

@ -7,7 +7,6 @@
//! max dBZ in a ~25 km box, matching Elixir's
//! `extract_box/5` output field `max_reflectivity_dbz`.
use bytes::Bytes;
use chrono::{DateTime, Datelike, Timelike, Utc};
pub const LON_MIN: f64 = -126.0;
@ -136,7 +135,7 @@ pub async fn fetch_frame(
if !resp.status().is_success() {
return Err(NexradError::Status(resp.status().as_u16()));
}
let body: Bytes = resp.bytes().await?;
let body = resp.bytes().await?;
let (pixels, width) = decode_n0q_png(&body)?;
let obs = points

View file

@ -173,7 +173,6 @@ fn clamp_score(s: i32) -> u8 {
/// the raw row-major body plus the metadata. Mirrors the Elixir
/// `decode/1` sans Access-behavior niceties.
pub fn decode(bytes: &[u8]) -> Option<Decoded> {
use byteorder::{ByteOrder, LittleEndian};
if bytes.len() < 4 + 1 + 4 + 8 + 4 + 4 + 4 + 2 + 2 {
return None;
}
@ -183,13 +182,13 @@ pub fn decode(bytes: &[u8]) -> Option<Decoded> {
if bytes[4] != VERSION {
return None;
}
let band_mhz = LittleEndian::read_u32(&bytes[5..9]);
let valid_time_unix = LittleEndian::read_i64(&bytes[9..17]);
let lat_min = LittleEndian::read_f32(&bytes[17..21]);
let lon_min = LittleEndian::read_f32(&bytes[21..25]);
let step = LittleEndian::read_f32(&bytes[25..29]);
let n_rows = LittleEndian::read_u16(&bytes[29..31]);
let n_cols = LittleEndian::read_u16(&bytes[31..33]);
let band_mhz = u32::from_le_bytes(bytes[5..9].try_into().ok()?);
let valid_time_unix = i64::from_le_bytes(bytes[9..17].try_into().ok()?);
let lat_min = f32::from_le_bytes(bytes[17..21].try_into().ok()?);
let lon_min = f32::from_le_bytes(bytes[21..25].try_into().ok()?);
let step = f32::from_le_bytes(bytes[25..29].try_into().ok()?);
let n_rows = u16::from_le_bytes(bytes[29..31].try_into().ok()?);
let n_cols = u16::from_le_bytes(bytes[31..33].try_into().ok()?);
let body_len = (n_rows as usize) * (n_cols as usize);
if bytes.len() < 33 + body_len {
return None;

View file

@ -11,7 +11,6 @@
use std::io::{Cursor, Read};
use byteorder::{LittleEndian, ReadBytesExt};
use prop_grid_rs::{band_config, scorer};
fn opt(v: f64) -> Option<f64> {
@ -22,14 +21,26 @@ fn opt(v: f64) -> Option<f64> {
}
}
fn read_exact<const N: usize>(r: &mut Cursor<&[u8]>) -> [u8; N] {
let mut buf = [0u8; N];
r.read_exact(&mut buf).expect("read_exact");
buf
}
fn read_f64(r: &mut Cursor<&[u8]>) -> f64 {
r.read_f64::<LittleEndian>().expect("f64")
f64::from_le_bytes(read_exact::<8>(r))
}
fn read_u32(r: &mut Cursor<&[u8]>) -> u32 {
u32::from_le_bytes(read_exact::<4>(r))
}
fn read_i32(r: &mut Cursor<&[u8]>) -> i32 {
i32::from_le_bytes(read_exact::<4>(r))
}
fn read_u8(r: &mut Cursor<&[u8]>) -> u8 {
let mut buf = [0u8; 1];
r.read_exact(&mut buf).expect("u8");
buf[0]
read_exact::<1>(r)[0]
}
#[test]
@ -38,7 +49,7 @@ fn matches_elixir_golden_fixture() {
.expect("tests/scores.bincode — run `mix rust.golden` first");
let mut r = Cursor::new(bytes.as_slice());
let n = r.read_u32::<LittleEndian>().expect("n_samples");
let n = read_u32(&mut r);
assert!(n > 0, "empty fixture");
let mut mismatches: Vec<String> = Vec::new();
@ -63,8 +74,8 @@ fn matches_elixir_golden_fixture() {
best_duct_band_ghz: opt(read_f64(&mut r)),
bulk_richardson: opt(read_f64(&mut r)),
};
let band_mhz = r.read_u32::<LittleEndian>().expect("band_mhz");
let expected = r.read_i32::<LittleEndian>().expect("expected_score");
let band_mhz = read_u32(&mut r);
let expected = read_i32(&mut r);
let band = band_config::get(band_mhz).expect("band in config");
let got = scorer::composite_score(&c, band).score;