Skip to content

Commit 2783e60

Browse files
authored
fix(acl): preserve Number::Int on serde_json round-trip (#15481)
* fix(acl): preserve Number::Int on serde_json round-trip From<serde_json::Value> for Value was checking as_f64() first, which succeeds for any integer that fits in an f64, causing all integer values to be silently coerced to Number::Float on deserialization. Fix the check order to prefer as_i64() first, then as_u64() (falling back to Float for values above i64::MAX to avoid silent wrapping), and only using as_f64() for genuine floating-point numbers. Fixes #15480 * fix(acl): preserve Number::Int on serde_json round-trip From<serde_json::Value> for Value was checking as_f64() first, which succeeds for any integer that fits in an f64, causing all integer values to be silently coerced to Number::Float on deserialization. Fix the check order to prefer as_i64() first, then as_u64() (cast to i64, wrapping for values above i64::MAX), and only using as_f64() for genuine floating-point numbers. Fixes #15480
1 parent f092d10 commit 2783e60

2 files changed

Lines changed: 12 additions & 5 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"tauri-utils": "patch:bug"
3+
---
4+
5+
Fix `Number::Int` being silently coerced to `Number::Float` on `serde_json` round-trip.
6+
7+
`From<serde_json::Value> for Value` was checking `as_f64()` first, which succeeds for every integer that fits in an f64, so integer JSON numbers were always deserialized as `Number::Float`. The check order is now `as_i64()` → `as_u64()` (cast to `i64`, wrapping for values above `i64::MAX`) → `as_f64()`, matching serde_json's own visitor convention.

‎crates/tauri-utils/src/acl/value.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ impl From<serde_json::Value> for Value {
8686
match value {
8787
serde_json::Value::Null => Value::Null,
8888
serde_json::Value::Bool(b) => Value::Bool(b),
89-
serde_json::Value::Number(n) => Value::Number(if let Some(f) = n.as_f64() {
89+
serde_json::Value::Number(n) => Value::Number(if let Some(i) = n.as_i64() {
90+
Number::Int(i)
91+
} else if let Some(u) = n.as_u64() {
92+
Number::Int(u as i64)
93+
} else if let Some(f) = n.as_f64() {
9094
Number::Float(f)
91-
} else if let Some(n) = n.as_u64() {
92-
Number::Int(n as i64)
93-
} else if let Some(n) = n.as_i64() {
94-
Number::Int(n)
9595
} else {
9696
Number::Int(0)
9797
}),

0 commit comments

Comments
 (0)