feat(Rust): Add integer type inference option by jonashao · Pull Request #2791 · glideapps/quicktype
Description
This PR introduces integer type inference for Rust targets, providing better control over generated integer types (i32/i64):
-
Added
IntegerTypeenum with variants:conservative: Selectsi32/i64based on JSON sample rangesforce-i32: Always usesi32(caution: risk of overflow)force-i64: Default behavior (current output)
-
Added
integerTypeconfiguration option for CLI and programmatic interfaces:quicktype --integer-type conservative # Smart selection (default) quicktype --integer-type force-i32
Related Issue
#2790
(Original feature request: #2790)
Motivation and Context
- ⚠️ Problem: Current behavior always generates
i64even when values fit ini32, causing:- Memory bloat (4-byte vs 8-byte overhead)
- Compatibility issues with Rust libraries expecting
i32 - Serialization/deserialization performance penalties
- ✅ Solution: Gives users control to optimize for:
- Memory efficiency (
force-i32) - Safety (
force-i64) - Smart balancing (
conservative)
- Memory efficiency (
Previous Behaviour / Output
All integers unconditionally became i64:
// JSON schema input: {"id": {"type": "integer","minimum": 0, "maximum": 100}} pub struct Data { pub id: i64, // ← Always i64 even for small values }
New Behaviour / Output
With --integer-type conservative:
// JSON schema input: {"id": {"type": "integer","minimum": 0, "maximum": 100}, "big": {"type": "integer","minimum": 0, "maximum": 9223372036854775807}} pub struct Data { pub id: i32, // ← conservative-downgraded to i32 pub big: i64, // ← Remains i64 for large values }
How Has This Been Tested?
-
Unit Tests:
- Added integer-type.schema test input and rust langauge quickTestRendererOptions:
- Range detection logic (
conservativemode) - Forced type behaviors (
force-i32/force-i64)
- Range detection logic (
- Integration tests for CLI flag parsing
- Added integer-type.schema test input and rust langauge quickTestRendererOptions:
-
Validation Tests:
# Tested with sample datasets: script/quicktype -s schema test/inputs/schema/integer-type.schema -o out.rs script/quicktype -s schema test/inputs/schema/integer-type.schema -o out.rs --integer-type force-i32 script/quicktype -s schema test/inputs/schema/integer-type.schema -o out.rs --integer-type force-i64- Verified output compiles with
cargo check
- Verified output compiles with
-
Environment:
- Rust 1.87 + TypeScript 5.0
- Windows/Linux/macOS cross-validation