Skip to content

Commit 4194677

Browse files
authored
Merge branch 'main' into add_automated_insta_snapshot_testing
2 parents d4fde6d + 718aa6a commit 4194677

49 files changed

Lines changed: 6298 additions & 239 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 0 additions & 141 deletions
This file was deleted.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
resolver = '2'
33
members = [
44
"source/postcard",
5+
"source/postcard2",
56
"source/postcard-derive",
67
"source/postcard-derive-ng",
78
"source/postcard-dyn",

source/postcard-derive-ng/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "postcard-derive-ng"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
authors = [
55
"Lachlan Sneff <lachlan.sneff@gmail.com>",
66
"James Munns <james@onevariable.com>",

source/postcard-derive-ng/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn derive_max_size(item: proc_macro::TokenStream) -> proc_macro::TokenStream
1010
}
1111

1212
/// Derive the `postcard_schema::Schema` trait for a struct or enum.
13-
#[proc_macro_derive(Schema, attributes(postcard))]
13+
#[proc_macro_derive(Schema, attributes(postcard, serde))]
1414
pub fn derive_schema(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
1515
let input = parse_macro_input!(item as DeriveInput);
1616
schema::do_derive_schema(input)

source/postcard-derive-ng/src/max_size.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn do_derive_max_size(item: proc_macro::TokenStream) -> proc_macro::TokenStr
1818
let sum = max_size_sum(&input.data, span).unwrap_or_else(syn::Error::into_compile_error);
1919

2020
let expanded = quote! {
21-
impl #impl_generics ::postcard::experimental::max_size::MaxSize for #name #ty_generics #where_clause {
21+
impl #impl_generics ::postcard2::experimental::max_size::MaxSize for #name #ty_generics #where_clause {
2222
const POSTCARD_MAX_SIZE: usize = #sum;
2323
}
2424
};
@@ -32,7 +32,7 @@ fn add_trait_bounds(mut generics: Generics) -> Generics {
3232
if let GenericParam::Type(ref mut type_param) = *param {
3333
type_param
3434
.bounds
35-
.push(parse_quote!(::postcard::experimental::max_size::MaxSize));
35+
.push(parse_quote!(::postcard2::experimental::max_size::MaxSize));
3636
}
3737
}
3838
generics
@@ -70,7 +70,7 @@ fn max_size_sum(data: &Data, span: Span) -> Result<TokenStream, syn::Error> {
7070
}
7171
Data::Union(_) => Err(syn::Error::new(
7272
span,
73-
"unions are not supported by `postcard::MaxSize`",
73+
"unions are not supported by `postcard2::MaxSize`",
7474
)),
7575
}
7676
}
@@ -86,7 +86,7 @@ fn sum_fields(fields: &Fields) -> TokenStream {
8686

8787
let recurse = fields.named.iter().map(|f| {
8888
let ty = &f.ty;
89-
quote_spanned! { f.span() => <#ty as ::postcard::experimental::max_size::MaxSize>::POSTCARD_MAX_SIZE }
89+
quote_spanned! { f.span() => <#ty as ::postcard2::experimental::max_size::MaxSize>::POSTCARD_MAX_SIZE }
9090
});
9191

9292
quote! {
@@ -96,7 +96,7 @@ fn sum_fields(fields: &Fields) -> TokenStream {
9696
syn::Fields::Unnamed(fields) => {
9797
let recurse = fields.unnamed.iter().map(|f| {
9898
let ty = &f.ty;
99-
quote_spanned! { f.span() => <#ty as ::postcard::experimental::max_size::MaxSize>::POSTCARD_MAX_SIZE }
99+
quote_spanned! { f.span() => <#ty as ::postcard2::experimental::max_size::MaxSize>::POSTCARD_MAX_SIZE }
100100
});
101101

102102
quote! {

source/postcard-derive-ng/src/schema.rs

Lines changed: 68 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,24 @@ pub fn do_derive_schema(input: DeriveInput) -> syn::Result<TokenStream> {
2121
};
2222
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
2323

24-
let ty = generator.generate_type(&input.data, span, name.to_string())?;
24+
let mut rename = None;
25+
for attr in &input.attrs {
26+
if attr.path().is_ident("serde") {
27+
// Parsing a serde attribute should not fail; if it does, we don't care about the attribute
28+
let _: syn::Result<()> = attr.parse_nested_meta(|meta| {
29+
// #[serde(rename = "name")]
30+
if meta.path.is_ident("rename") {
31+
rename = Some(meta.value()?.parse::<syn::LitStr>()?.value());
32+
}
33+
Ok(())
34+
});
35+
}
36+
}
37+
let ty = generator.generate_type(
38+
&input.data,
39+
span,
40+
rename.unwrap_or_else(|| name.to_string()),
41+
)?;
2542

2643
let postcard_schema = &generator.postcard_schema;
2744
let insta_test = generator.generate_snapshot_test(name);
@@ -125,7 +142,21 @@ impl Generator {
125142
}
126143
Data::Enum(data) => {
127144
let variants = data.variants.iter().map(|v| {
128-
let (name, data) = (v.ident.to_string(), self.generate_variants(&v.fields));
145+
let mut rename = None;
146+
for attr in &v.attrs {
147+
if attr.path().is_ident("serde") {
148+
// Parsing a serde attribute should not fail; if it does, we don't care about the attribute
149+
let _: syn::Result<()> = attr.parse_nested_meta(|meta| {
150+
// #[serde(rename = "name")]
151+
if meta.path.is_ident("rename") {
152+
rename = Some(meta.value()?.parse::<syn::LitStr>()?.value());
153+
}
154+
Ok(())
155+
});
156+
}
157+
}
158+
let name = rename.unwrap_or_else(|| v.ident.to_string());
159+
let data = self.generate_variants(&v.fields);
129160
quote! { #postcard_schema::schema::Variant { name: #name, data: #data } }
130161
});
131162

@@ -147,27 +178,19 @@ impl Generator {
147178
let postcard_schema = &self.postcard_schema;
148179
match fields {
149180
syn::Fields::Named(fields) => {
150-
let fields = fields.named.iter().map(|f| {
151-
let ty = &f.ty;
152-
let name = f.ident.as_ref().unwrap().to_string();
153-
quote_spanned!(f.span() => &#postcard_schema::schema::NamedField { name: #name, ty: <#ty as #postcard_schema::Schema>::SCHEMA })
154-
});
181+
let fields = fields.named.iter().map(|f| self.generate_field(f));
155182
quote! { #postcard_schema::schema::Data::Struct(&[
156183
#( #fields ),*
157184
]) }
158185
}
159186
syn::Fields::Unnamed(fields) => {
160187
if fields.unnamed.len() == 1 {
161-
let f = fields.unnamed[0].clone();
162-
let ty = &f.ty;
163-
let qs = quote_spanned!(f.span() => <#ty as #postcard_schema::Schema>::SCHEMA);
188+
let f = &fields.unnamed[0];
189+
let inner = self.generate_field(f);
164190

165-
quote! { #postcard_schema::schema::Data::Newtype(#qs) }
191+
quote! { #postcard_schema::schema::Data::Newtype(#inner) }
166192
} else {
167-
let fields = fields.unnamed.iter().map(|f| {
168-
let ty = &f.ty;
169-
quote_spanned!(f.span() => <#ty as #postcard_schema::Schema>::SCHEMA)
170-
});
193+
let fields = fields.unnamed.iter().map(|f| self.generate_field(f));
171194
quote! { #postcard_schema::schema::Data::Tuple(&[
172195
#( #fields ),*
173196
]) }
@@ -183,27 +206,19 @@ impl Generator {
183206
let postcard_schema = &self.postcard_schema;
184207
match fields {
185208
syn::Fields::Named(fields) => {
186-
let fields = fields.named.iter().map(|f| {
187-
let ty = &f.ty;
188-
let name = f.ident.as_ref().unwrap().to_string();
189-
quote_spanned!(f.span() => &#postcard_schema::schema::NamedField { name: #name, ty: <#ty as #postcard_schema::Schema>::SCHEMA })
190-
});
209+
let fields = fields.named.iter().map(|f| self.generate_field(f));
191210
quote! { #postcard_schema::schema::Data::Struct(&[
192211
#( #fields ),*
193212
]) }
194213
}
195214
syn::Fields::Unnamed(fields) => {
196215
if fields.unnamed.len() == 1 {
197-
let f = fields.unnamed[0].clone();
198-
let ty = &f.ty;
199-
let qs = quote_spanned!(f.span() => <#ty as #postcard_schema::Schema>::SCHEMA);
216+
let f = &fields.unnamed[0];
217+
let inner = self.generate_field(f);
200218

201-
quote! { #postcard_schema::schema::Data::Newtype(#qs) }
219+
quote! { #postcard_schema::schema::Data::Newtype(#inner) }
202220
} else {
203-
let fields = fields.unnamed.iter().map(|f| {
204-
let ty = &f.ty;
205-
quote_spanned!(f.span() => <#ty as #postcard_schema::Schema>::SCHEMA)
206-
});
221+
let fields = fields.unnamed.iter().map(|f| self.generate_field(f));
207222
quote! { #postcard_schema::schema::Data::Tuple(&[
208223
#( #fields ),*
209224
]) }
@@ -215,6 +230,31 @@ impl Generator {
215230
}
216231
}
217232

233+
fn generate_field(&self, field: &syn::Field) -> TokenStream {
234+
let postcard_schema = &self.postcard_schema;
235+
let ty = &field.ty;
236+
match &field.ident {
237+
None => quote_spanned!(field.span()=> <#ty as #postcard_schema::Schema>::SCHEMA),
238+
Some(name) => {
239+
let mut rename = None;
240+
for attr in &field.attrs {
241+
if attr.path().is_ident("serde") {
242+
// Parsing a serde attribute should not fail; if it does, we don't care about the attribute
243+
let _: syn::Result<()> = attr.parse_nested_meta(|meta| {
244+
// #[serde(rename = "name")]
245+
if meta.path.is_ident("rename") {
246+
rename = Some(meta.value()?.parse::<syn::LitStr>()?.value());
247+
}
248+
Ok(())
249+
});
250+
}
251+
}
252+
let name = rename.unwrap_or_else(|| name.to_string());
253+
quote_spanned!(field.span()=> &#postcard_schema::schema::NamedField { name: #name, ty: <#ty as #postcard_schema::Schema>::SCHEMA })
254+
}
255+
}
256+
}
257+
218258
/// Add a bound `T: Schema` to every type parameter T.
219259
fn add_trait_bounds(&self, mut generics: Generics) -> Generics {
220260
let postcard_schema = &self.postcard_schema;

source/postcard-derive/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "postcard-derive"
3-
version = "0.2.1"
3+
version = "0.2.2"
44
authors = [
55
"Lachlan Sneff <lachlan.sneff@gmail.com>",
66
"James Munns <james@onevariable.com>",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../LICENSE-APACHE

source/postcard-derive/LICENSE-MIT

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../LICENSE-MIT

source/postcard-derive/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn derive_max_size(item: proc_macro::TokenStream) -> proc_macro::TokenStream
1010
}
1111

1212
/// Derive the `postcard_schema::Schema` trait for a struct or enum.
13-
#[proc_macro_derive(Schema, attributes(postcard))]
13+
#[proc_macro_derive(Schema, attributes(postcard, serde))]
1414
pub fn derive_schema(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
1515
let input = parse_macro_input!(item as DeriveInput);
1616
schema::do_derive_schema(input)

0 commit comments

Comments
 (0)