1.5 KiB
1.5 KiB
| id | type | title | tags | importance | confidence | created | updated | relations | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 27a1f728-ec90-469c-a6ab-5644d333322f | fix | Rust: reqwest response.json() yields reqwest::Error, not serde_json::Error |
|
0.5 | 0.8 | 2026-02-28T04:58:15.771467+00:00 | 2026-03-02T00:33:44.221351+00:00 |
|
Fix: reqwest JSON Error Type Mismatch
Problem
When using response.json::<T>().await, JSON decode failures produce a reqwest::Error — not a serde_json::Error. This means a custom error variant like:
#[derive(Debug, thiserror::Error)]
enum ApiError {
#[error("Parse error: {0}")]
Parse(#[from] serde_json::Error),
// ...
}
...is unreachable if you only call response.json(). The #[from] impl exists but can never fire.
Fix
Decode manually in two steps so the serde_json::Error is produced directly:
let body = response.text().await.map_err(ApiError::Request)?;
let data = serde_json::from_str::<T>(&body).map_err(ApiError::Parse)?;
Why It Matters
This lets callers distinguish network errors (connection dropped, timeout) from JSON parse errors (malformed response, schema mismatch). With response.json(), both collapse into reqwest::Error and you lose that distinction.
Context
Caught during code review of api/client.rs in SBA Scout Rust rewrite Phase 2.