Skip to content

Commit f7923a3

Browse files
committed
fix handling of skip/default in several places
1 parent 0ab19d1 commit f7923a3

File tree

4 files changed

+66
-38
lines changed

4 files changed

+66
-38
lines changed

derive/src/serde_bin.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use alloc::string::String;
33

44
use crate::{
55
parse::{Category, Enum, Struct, Type},
6-
shared::{enum_bounds_strings, struct_bounds_strings},
6+
shared::{attrs_skip, enum_bounds_strings, struct_bounds_strings},
77
};
88

99
use proc_macro::TokenStream;
@@ -41,7 +41,7 @@ pub fn derive_ser_bin_struct(struct_: &Struct, crate_name: &str) -> TokenStream
4141
let (generic_w_bounds, generic_no_bounds) =
4242
struct_bounds_strings(struct_, "SerBin", crate_name);
4343

44-
for field in &struct_.fields {
44+
for field in struct_.fields.iter().filter(|f| !attrs_skip(&f.attributes)) {
4545
if let Some(proxy) = crate::shared::attrs_proxy(&field.attributes) {
4646
l!(
4747
body,
@@ -82,14 +82,20 @@ pub fn derive_ser_bin_struct_unnamed(struct_: &Struct, crate_name: &str) -> Toke
8282
let (generic_w_bounds, generic_no_bounds) =
8383
struct_bounds_strings(struct_, "SerBin", crate_name);
8484

85-
for (n, field) in struct_.fields.iter().enumerate() {
85+
for (n, field) in struct_
86+
.fields
87+
.iter()
88+
.enumerate()
89+
.filter(|(_, f)| !attrs_skip(&f.attributes))
90+
{
8691
if let Some(proxy) = crate::shared::attrs_proxy(&field.attributes) {
8792
l!(body, "let proxy: {} = Into::into(&self.{});", proxy, n);
8893
l!(body, "proxy.ser_bin(s);");
8994
} else {
9095
l!(body, "self.{}.ser_bin(s);", n);
9196
}
9297
}
98+
9399
format!(
94100
"impl{} {}::SerBin for {}{} {{
95101
fn ser_bin(&self, s: &mut Vec<u8>) {{
@@ -113,7 +119,7 @@ pub fn derive_de_bin_struct(struct_: &Struct, crate_name: &str) -> TokenStream {
113119
let mut body = String::new();
114120
let (generic_w_bounds, generic_no_bounds) = struct_bounds_strings(struct_, "DeBin", crate_name);
115121

116-
for field in &struct_.fields {
122+
for field in struct_.fields.iter().filter(|f| !attrs_skip(&f.attributes)) {
117123
if let Some(proxy) = crate::shared::attrs_proxy(&field.attributes) {
118124
l!(body, "{}: {{", field.field_name.as_ref().unwrap());
119125
l!(
@@ -134,6 +140,14 @@ pub fn derive_de_bin_struct(struct_: &Struct, crate_name: &str) -> TokenStream {
134140
}
135141
}
136142

143+
for field in struct_.fields.iter().filter(|f| attrs_skip(&f.attributes)) {
144+
l!(
145+
body,
146+
"{}: Default::default(),",
147+
field.field_name.as_ref().unwrap()
148+
);
149+
}
150+
137151
format!(
138152
"impl{} {}::DeBin for {}{} {{
139153
fn de_bin(o:&mut usize, d:&[u8]) -> ::core::result::Result<Self, {}::DeBinErr> {{
@@ -160,7 +174,12 @@ pub fn derive_de_bin_struct_unnamed(struct_: &Struct, crate_name: &str) -> Token
160174
let mut body = String::new();
161175
let (generic_w_bounds, generic_no_bounds) = struct_bounds_strings(struct_, "DeBin", crate_name);
162176

163-
for (n, field) in struct_.fields.iter().enumerate() {
177+
for (n, field) in struct_
178+
.fields
179+
.iter()
180+
.enumerate()
181+
.filter(|(_, f)| !attrs_skip(&f.attributes))
182+
{
164183
if let Some(proxy) = crate::shared::attrs_proxy(&field.attributes) {
165184
l!(body, "{}: {{", n);
166185
l!(
@@ -176,6 +195,14 @@ pub fn derive_de_bin_struct_unnamed(struct_: &Struct, crate_name: &str) -> Token
176195
}
177196
}
178197

198+
for field in struct_.fields.iter().filter(|f| attrs_skip(&f.attributes)) {
199+
l!(
200+
body,
201+
"{}: Default::default(),",
202+
field.field_name.as_ref().unwrap()
203+
);
204+
}
205+
179206
format!(
180207
"impl{} {}::DeBin for {}{} {{
181208
fn de_bin(o:&mut usize, d:&[u8]) -> ::core::result::Result<Self, {}::DeBinErr> {{

derive/src/serde_ron.rs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::parse::{Attribute, Category, Enum, Field, Struct, Type};
66

77
use proc_macro::TokenStream;
88

9-
use crate::shared;
9+
use crate::shared::{self, attrs_skip};
1010

1111
pub fn derive_ser_ron_proxy(proxy_type: &str, type_: &str, crate_name: &str) -> TokenStream {
1212
format!(
@@ -39,7 +39,7 @@ pub fn derive_de_ron_proxy(proxy_type: &str, type_: &str, crate_name: &str) -> T
3939
pub fn derive_ser_ron_struct(struct_: &Struct, crate_name: &str) -> TokenStream {
4040
let mut s = String::new();
4141

42-
for field in &struct_.fields {
42+
for field in struct_.fields.iter().filter(|f| !attrs_skip(&f.attributes)) {
4343
let struct_fieldname = field.field_name.clone().unwrap();
4444
let ron_fieldname =
4545
shared::attrs_rename(&field.attributes).unwrap_or_else(|| struct_fieldname.clone());
@@ -96,7 +96,12 @@ pub fn derive_ser_ron_struct_unnamed(struct_: &Struct, crate_name: &str) -> Toke
9696
let mut body = String::new();
9797

9898
let last = struct_.fields.len() - 1;
99-
for (n, _) in struct_.fields.iter().enumerate() {
99+
for (n, _field) in struct_
100+
.fields
101+
.iter()
102+
.enumerate()
103+
.filter(|(_, f)| !attrs_skip(&f.attributes))
104+
{
100105
l!(body, "self.{}.ser_ron(d, s);", n);
101106
if n != last {
102107
l!(body, "s.out.push_str(\", \");");
@@ -136,9 +141,11 @@ pub fn derive_de_ron_named(
136141
let container_attr_default = shared::attrs_default(attributes).is_some();
137142

138143
let mut unwraps = Vec::new();
139-
for field in fields {
144+
for field in fields.iter() {
140145
let struct_fieldname = field.field_name.as_ref().unwrap().to_string();
141146
let localvar = format!("_{}", struct_fieldname);
147+
let field_is_option = field.ty.base() == "Option";
148+
let field_attr_skip = shared::attrs_skip(&field.attributes);
142149
let field_attr_default = shared::attrs_default(&field.attributes);
143150
let field_attr_default_with = shared::attrs_default_with(&field.attributes);
144151
let default_val = if let Some(v) = field_attr_default {
@@ -149,40 +156,28 @@ pub fn derive_de_ron_named(
149156
val = format!("Some({})", val);
150157
}
151158
Some(val)
152-
} else if field.ty.base() != "Option" {
159+
} else if !field_is_option {
153160
Some(String::from("Default::default()"))
154161
} else {
155162
Some(String::from("None"))
156163
}
157164
} else if let Some(mut v) = field_attr_default_with {
158165
v.push_str("()");
159166
Some(v)
167+
} else if container_attr_default || field_attr_skip || field_is_option {
168+
Some(String::from("Default::default()"))
160169
} else {
161170
None
162171
};
163-
let ron_fieldname =
164-
shared::attrs_rename(&field.attributes).unwrap_or(struct_fieldname.clone());
165-
let skip = crate::shared::attrs_skip(&field.attributes);
166-
167-
if !skip {
168-
if field.ty.base() == "Option" || container_attr_default || default_val.is_some() {
169-
if let Some(default_val) = default_val {
170-
unwraps.push(format!("{}.unwrap_or_else(|| {})", localvar, default_val));
171-
} else {
172-
unwraps.push(format!("{}.unwrap_or_default()", localvar));
173-
}
174-
} else {
175-
unwraps.push(format!(
176-
"{}.ok_or_else(|| s.err_nf(\"{}\"))?",
177-
localvar, struct_fieldname
178-
));
179-
}
180-
} else {
181-
unwraps.push(format!(
182-
"{{ {} }}",
183-
default_val.as_deref().unwrap_or("Default::default()")
184-
));
185-
}
172+
let ron_fieldname =(!field_attr_skip).then(|| shared::attrs_rename(&field.attributes).unwrap_or(struct_fieldname.clone()));
173+
174+
unwraps.push(match default_val {
175+
Some(def) => format!("{}.unwrap_or_else(|| {})", localvar, def),
176+
None => format!(
177+
"{}.ok_or_else(|| s.err_nf(\"{}\"))?",
178+
localvar, struct_fieldname
179+
),
180+
});
186181

187182
struct_field_names.push(struct_fieldname);
188183
ron_field_names.push(ron_fieldname);
@@ -203,6 +198,9 @@ pub fn derive_de_ron_named(
203198
let match_names = if !ron_field_names.is_empty() {
204199
let mut inner = String::new();
205200
for (ron_field_name, (local_var, _)) in ron_field_names.iter().zip(local_vars.iter()) {
201+
let Some(ron_field_name) = ron_field_name else {
202+
continue;
203+
};
206204
l!(
207205
inner,
208206
"\"{}\" => {{

tests/bin.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fn binary() {
3434

3535
#[test]
3636
fn binary_generics() {
37-
#[derive(DeBin, SerBin, PartialEq)]
37+
#[derive(DeBin, SerBin, PartialEq, Debug)]
3838
struct TestGenericsWSkip<A, B, C, DD: Eq + Ord, EE>
3939
where
4040
EE: Eq + Ord,
@@ -57,9 +57,12 @@ fn binary_generics() {
5757

5858
let bytes = SerBin::serialize_bin(&test);
5959

60-
let test_deserialized = DeBin::deserialize_bin(&bytes).unwrap();
60+
let mut test_deserialized = DeBin::deserialize_bin(&bytes).unwrap();
6161

62-
assert!(test == test_deserialized);
62+
// show that everything is equal, except for the skipped field
63+
assert_ne!(test, test_deserialized);
64+
test_deserialized.test4 = test.test4.clone();
65+
assert_eq!(test, test_deserialized);
6366

6467
#[derive(DeBin, SerBin, PartialEq)]
6568
pub enum TestEnum<A, B> {

tests/ser_de.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn ser_de() {
3131
f: Option<([u32; 4], String)>,
3232
g: (),
3333
h: f64,
34-
#[nserde(skip)]
34+
#[nserde(skip, default)]
3535
i: Test2,
3636
}
3737

@@ -47,7 +47,7 @@ fn ser_de() {
4747
f: Some(([1, 2, 3, 4], "tuple".to_string())),
4848
g: (),
4949
h: 1e30,
50-
i: Default::default()
50+
i: Default::default(),
5151
};
5252

5353
#[cfg(feature = "binary")]

0 commit comments

Comments
 (0)