Skip to content

Commit 5d3c563

Browse files
committed
Document tuple impls as fake variadic
1 parent 3761854 commit 5d3c563

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

serde/src/de/impls.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,19 @@ array_impls! {
13931393
macro_rules! tuple_impls {
13941394
($($len:tt => ($($n:tt $name:ident)+))+) => {
13951395
$(
1396-
impl<'de, $($name: Deserialize<'de>),+> Deserialize<'de> for ($($name,)+) {
1396+
#[cfg_attr(docsrs, doc(hidden))]
1397+
impl<'de, $($name),+> Deserialize<'de> for ($($name,)+)
1398+
where
1399+
$($name: Deserialize<'de>,)+
1400+
{
1401+
tuple_impl_body!($len => ($($n $name)+));
1402+
}
1403+
)+
1404+
};
1405+
}
1406+
1407+
macro_rules! tuple_impl_body {
1408+
($len:tt => ($($n:tt $name:ident)+)) => {
13971409
#[inline]
13981410
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
13991411
where
@@ -1462,13 +1474,22 @@ macro_rules! tuple_impls {
14621474

14631475
deserializer.deserialize_tuple($len, TupleInPlaceVisitor(place))
14641476
}
1465-
}
1466-
)+
1467-
}
1477+
};
1478+
}
1479+
1480+
#[cfg_attr(docsrs, doc(fake_variadic))]
1481+
#[cfg_attr(
1482+
docsrs,
1483+
doc = "This trait is implemented for tuples up to 16 items long."
1484+
)]
1485+
impl<'de, T> Deserialize<'de> for (T,)
1486+
where
1487+
T: Deserialize<'de>,
1488+
{
1489+
tuple_impl_body!(1 => (0 T));
14681490
}
14691491

14701492
tuple_impls! {
1471-
1 => (0 T0)
14721493
2 => (0 T0 1 T1)
14731494
3 => (0 T0 1 T1 2 T2)
14741495
4 => (0 T0 1 T1 2 T2 3 T3)

serde/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@
9999
// Support using Serde without the standard library!
100100
#![cfg_attr(not(feature = "std"), no_std)]
101101
// Show which crate feature enables conditionally compiled APIs in documentation.
102-
#![cfg_attr(docsrs, feature(doc_cfg))]
102+
#![cfg_attr(docsrs, feature(doc_cfg, rustdoc_internals))]
103+
#![cfg_attr(docsrs, allow(internal_features))]
103104
// Unstable functionality only if the user asks for it. For tracking and
104105
// discussion of these features please refer to this issue:
105106
//

serde/src/ser/impls.rs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,19 @@ impl Serialize for ! {
386386
macro_rules! tuple_impls {
387387
($($len:expr => ($($n:tt $name:ident)+))+) => {
388388
$(
389+
#[cfg_attr(docsrs, doc(hidden))]
389390
impl<$($name),+> Serialize for ($($name,)+)
390391
where
391392
$($name: Serialize,)+
392393
{
394+
tuple_impl_body!($len => ($($n)+));
395+
}
396+
)+
397+
};
398+
}
399+
400+
macro_rules! tuple_impl_body {
401+
($len:expr => ($($n:tt)+)) => {
393402
#[inline]
394403
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
395404
where
@@ -401,13 +410,22 @@ macro_rules! tuple_impls {
401410
)+
402411
tuple.end()
403412
}
404-
}
405-
)+
406-
}
413+
};
414+
}
415+
416+
#[cfg_attr(docsrs, doc(fake_variadic))]
417+
#[cfg_attr(
418+
docsrs,
419+
doc = "This trait is implemented for tuples up to 16 items long."
420+
)]
421+
impl<T> Serialize for (T,)
422+
where
423+
T: Serialize,
424+
{
425+
tuple_impl_body!(1 => (0));
407426
}
408427

409428
tuple_impls! {
410-
1 => (0 T0)
411429
2 => (0 T0 1 T1)
412430
3 => (0 T0 1 T1 2 T2)
413431
4 => (0 T0 1 T1 2 T2 3 T3)

0 commit comments

Comments
 (0)