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}