serde-tuplex

Crates.ioserde-tuplex
lib.rsserde-tuplex
version0.1.1
created_at2025-11-09 13:00:04.883172+00
updated_at2025-11-09 13:11:00.964815+00
descriptionTuple serialization and lenient numeric parsing for serde
homepage
repositoryhttps://github.com/Arasple/serde-tuplex
max_upload_size
id1924111
size54,423
Fynn (Arasple)

documentation

README

serde-tuplex

crates.io docs.rs

tuple serialization and lenient numeric parsing for serde

Features

  • Lenient parsing: Numeric fields accept both numbers and strings (123 or "123")
  • Tuple format: Serialize structs as arrays ([1, 2] instead of {"a": 1, "b": 2})
  • Zero boilerplate: Just add #[derive(Lenient)]
  • Field-level control: Use #[serde_tuplex(skip)] or lenient helper

Installation

cargo add serde-tuplex serde --features serde/derive

Or manually in Cargo.toml:

[dependencies]
serde-tuplex = "0.1"
serde = { version = "1.0", features = ["derive"] }

Usage

Lenient (struct format)

use serde_tuplex::Lenient;

#[derive(Lenient)]
struct User {
    id: u64,           // accepts 100 or "100"
    balance: f64,      // accepts 99.99 or "99.99"
    age: Option<u32>,  // accepts numbers, strings, null, or missing
    name: String,      // unchanged
}

TupleLenient (tuple format + lenient parsing)

use serde_tuplex::TupleLenient;

#[derive(TupleLenient)]
struct Measurement {
    timestamp: u64,
    value: f64,
}

// Accepts: [1234567890, 23.5] or ["1234567890", "23.5"]
// Serializes to: [1234567890, 23.5]

Tuple (tuple format, strict parsing)

use serde_tuplex::Tuple;

#[derive(Tuple)]
struct Point {
    x: u64,
    y: u64,
}

// Serializes to: [10, 20]

With raw serde

use serde::Deserialize;

#[derive(Deserialize)]
struct Data {
    #[serde(deserialize_with = "serde_tuplex::lenient")]
    count: u64,        // Lenient

    strict: u32,       // Strict
}

Field-level control

#[derive(Lenient)]
struct Config {
    timeout: u64,      // Auto: lenient

    #[serde_tuplex(skip)]
    port: u16,         // Strict parsing only
}
Commit count: 0

cargo fmt