serde_tuplex/
lib.rs

1//! Tuple serialization and lenient numeric parsing for serde.
2//!
3//! # Features
4//!
5//! - [`Tuple`] - Serialize/deserialize as `[1,2]` instead of `{"x":1,"y":2}`
6//! - [`Lenient`] - Accept both `123` and `"123"` for numeric fields
7//! - [`TupleLenient`] - Combine both
8//!
9//! # Examples
10//!
11//! ```
12//! use serde_tuplex::{Lenient, Tuple, TupleLenient};
13//!
14//! #[derive(Lenient)]
15//! struct User {
16//!     id: u64,        // Accepts 100 or "100"
17//!     name: String,
18//! }
19//!
20//! #[derive(Tuple)]
21//! struct Point { x: i32, y: i32 }  // JSON: [10,20]
22//!
23//! #[derive(TupleLenient)]
24//! struct Data { count: u64 }  // Both features
25//! ```
26//!
27//! ## Manual control
28//!
29//! ```
30//! use serde::Deserialize;
31//! use serde_tuplex::{lenient, lenient_option};
32//!
33//! #[derive(Deserialize)]
34//! struct Config {
35//!     #[serde(deserialize_with = "lenient")]
36//!     timeout: u64,
37//!     
38//!     // For Option<T>, add 'default' to handle missing fields
39//!     #[serde(deserialize_with = "lenient_option", default)]
40//!     retry: Option<u32>,
41//!     
42//!     port: u16,  // Strict
43//! }
44//! ```
45//!
46//! Use `#[serde_tuplex(skip)]` to disable lenient parsing:
47//!
48//! ```
49//! use serde_tuplex::Lenient;
50//!
51//! #[derive(Lenient)]
52//! struct Mixed {
53//!     lenient: u64,
54//!     #[serde_tuplex(skip)]
55//!     strict: u32,
56//! }
57//! ```
58
59mod de;
60mod internal;
61
62pub use de::{lenient, lenient_option};
63pub use serde_tuplex_derive::{Lenient, Tuple, TupleLenient};
64
65#[doc(hidden)]
66pub mod __private {
67    pub use crate::internal::{LenientValue, OptionalLenientValue};
68}