quicktype
quicktype copied to clipboard
feat(Rust): Add integer type inference option
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 ranges -
force-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: https://github.com/glideapps/quicktype/issues/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