Skip to content

Commit aad1add

Browse files
authored
Support skipping only some variants with Zeroize (#112)
1 parent 93aad23 commit aad1add

File tree

3 files changed

+52
-24
lines changed

3 files changed

+52
-24
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
**Note:** `Clone` is excluded from blanket skipping and can only be used with
1313
selective skipping to avoid this being a breaking change.
1414

15+
### Fixed
16+
- Support skipping only some variants with `Zeroize`.
17+
1518
## [1.3.0] - 2025-04-21
1619

1720
### Added

src/test/zeroize.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,35 @@ fn fqs() -> Result<()> {
233233

234234
#[test]
235235
fn enum_skip() -> Result<()> {
236+
test_derive(
237+
quote! {
238+
#[derive_where(Zeroize)]
239+
enum Test<T> {
240+
A(std::marker::PhantomData<T>),
241+
#[derive_where(skip_inner(Zeroize))]
242+
B(std::marker::PhantomData<T>),
243+
}
244+
},
245+
quote! {
246+
#[automatically_derived]
247+
impl <T> ::zeroize::Zeroize for Test<T> {
248+
fn zeroize(&mut self) {
249+
use ::zeroize::Zeroize;
250+
251+
match self {
252+
Test::A(ref mut __field_0) => {
253+
__field_0.zeroize();
254+
}
255+
Test::B(ref mut __field_0) => { }
256+
}
257+
}
258+
}
259+
},
260+
)
261+
}
262+
263+
#[test]
264+
fn enum_skip_drop() -> Result<()> {
236265
test_derive(
237266
quote! {
238267
#[derive_where(ZeroizeOnDrop)]

src/trait_/zeroize.rs

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -112,34 +112,30 @@ impl TraitImpl for Zeroize {
112112
trait_: &DeriveTrait,
113113
data: &Data,
114114
) -> TokenStream {
115-
if data.is_empty(**trait_) {
116-
TokenStream::new()
117-
} else {
118-
match data.simple_type() {
119-
SimpleType::Struct(fields) | SimpleType::Tuple(fields) => {
120-
let trait_path = trait_.path();
121-
let self_pattern = fields.self_pattern_mut();
122-
123-
let body = data
124-
.iter_fields(**trait_)
125-
.zip(data.iter_self_ident(**trait_))
126-
.map(|(field, self_ident)| {
127-
if field.attr.zeroize_fqs.0 {
128-
quote! { #trait_path::zeroize(#self_ident); }
129-
} else {
130-
quote! { #self_ident.zeroize(); }
131-
}
132-
});
133-
134-
quote! {
135-
#self_pattern => {
136-
#(#body)*
115+
match data.simple_type() {
116+
SimpleType::Struct(fields) | SimpleType::Tuple(fields) => {
117+
let trait_path = trait_.path();
118+
let self_pattern = fields.self_pattern_mut();
119+
120+
let body = data
121+
.iter_fields(**trait_)
122+
.zip(data.iter_self_ident(**trait_))
123+
.map(|(field, self_ident)| {
124+
if field.attr.zeroize_fqs.0 {
125+
quote! { #trait_path::zeroize(#self_ident); }
126+
} else {
127+
quote! { #self_ident.zeroize(); }
137128
}
129+
});
130+
131+
quote! {
132+
#self_pattern => {
133+
#(#body)*
138134
}
139135
}
140-
SimpleType::Unit(_) => TokenStream::new(),
141-
SimpleType::Union => unreachable!("unexpected trait for union"),
142136
}
137+
SimpleType::Unit(_) => TokenStream::new(),
138+
SimpleType::Union => unreachable!("unexpected trait for union"),
143139
}
144140
}
145141
}

0 commit comments

Comments
 (0)