Skip to main content

defuse_serde_utils/
seq.rs

1use serde::{Serialize, Serializer};
2use serde_with::SerializeAs;
3
4/// An adaptor for serializing a sequence backwards
5///
6/// # Examples
7///
8/// ```rust
9/// # use serde::Serialize;
10/// # use serde_json::json;
11/// use defuse_serde_utils::Reversed;
12/// use serde_with::serde_as;
13///
14/// #[serde_as]
15/// #[derive(Serialize)]
16/// struct A {
17///     #[serde_as(as = "Reversed")]
18///     #[serde(rename = "list")]
19///     rev_list: Vec<u32>,
20/// }
21///
22/// assert_eq!(
23///     serde_json::to_value(&A { rev_list: vec![3, 2, 1] }).unwrap(),
24///     json!({ "list": [1, 2, 3] }),
25/// );
26/// ```
27pub struct Reversed;
28
29impl<T> SerializeAs<[T]> for Reversed
30where
31    T: Serialize,
32{
33    #[inline]
34    fn serialize_as<S>(source: &[T], serializer: S) -> Result<S::Ok, S::Error>
35    where
36        S: Serializer,
37    {
38        serializer.collect_seq(source.iter().rev())
39    }
40}