@@ -12,8 +12,8 @@ impl<'de, T: Deserialize<'de>> Deserialize<'de> for Secret<T> {
12
12
13
13
/// A serializable type that contains a secret.
14
14
///
15
- /// This abstraction enables [expose_secret] to be used to serialize both `Secret<T>`, `&Secret<T>`
16
- /// and `Option <Secret<T>>`.
15
+ /// This abstraction enables [expose_secret] to be used to serialize both `Secret<T>`, `&Secret<T>`,
16
+ /// `Option<Secret<T>>` and `Vec <Secret<T>>`.
17
17
pub trait SerializableSecret < T > {
18
18
type Exposed < ' a > : Serialize
19
19
where
@@ -47,6 +47,15 @@ impl<T: Serialize> SerializableSecret<T> for Option<Secret<T>> {
47
47
}
48
48
}
49
49
50
+ #[ cfg( feature = "std" ) ]
51
+ impl < T : Serialize > SerializableSecret < T > for Vec < Secret < T > > where for < ' a > Vec < & ' a T > : Serialize {
52
+ type Exposed < ' a > = Vec < & ' a T > where T : ' a ;
53
+
54
+ fn expose_via ( & self , expose : impl Fn ( & Secret < T > ) -> & T ) -> Self :: Exposed < ' _ > {
55
+ self . iter ( ) . map ( expose) . collect ( )
56
+ }
57
+ }
58
+
50
59
/// Exposes a [Secret] for serialization.
51
60
///
52
61
/// For general-purpose secret exposing see [Secret::expose_secret].
@@ -97,6 +106,8 @@ mod tests {
97
106
one : Secret < String > ,
98
107
#[ serde( serialize_with = "expose_secret" ) ]
99
108
two : Option < Secret < String > > ,
109
+ #[ serde( serialize_with = "expose_secret" ) ]
110
+ three : Vec < Secret < String > > ,
100
111
}
101
112
102
113
let to_serialize: Test = Faker . fake ( ) ;
0 commit comments