Skip to content

Commit 7e79df4

Browse files
committed
Fixed bug with single-struct derives in Response macro
- New version 0.8.4 was tagged - Reported in #25
1 parent b11172d commit 7e79df4

File tree

4 files changed

+37
-33
lines changed

4 files changed

+37
-33
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
All changes in this project will be noted in this file.
44

5+
### 0.8.4
6+
7+
Fixed an issue with single-item struct derives when using the `Response` macro.
8+
59
### 0.8.3
610

711
Added the following implementations:

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ license = "Apache-2.0"
99
name = "skytable"
1010
readme = "README.md"
1111
repository = "https://github.com/skytable/client-rust"
12-
version = "0.8.3"
12+
version = "0.8.4"
1313

1414
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1515
[dependencies]
1616
# internal deps
17-
sky-derive = "0.2.0"
17+
sky-derive = "0.2.1"
1818
# external deps
1919
tokio = { version = "1.35.1", features = ["full"] }
2020
native-tls = "0.2.11"

sky-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 = "sky-derive"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
edition = "2021"
55
license = "Apache-2.0"
66
description = "Macros for the Skytable client driver"

sky-derive/src/lib.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,29 @@ extern crate proc_macro;
22

33
use proc_macro::TokenStream;
44
use quote::quote;
5-
use syn::{parse_macro_input, DeriveInput, Data, Fields};
5+
use syn::{parse_macro_input, Data, DeriveInput, Fields};
66

77
#[proc_macro_derive(Query)]
88
pub fn derive_query(input: TokenStream) -> TokenStream {
99
let input = parse_macro_input!(input as DeriveInput);
1010
let name = input.ident;
1111
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
1212
let ret = match input.data {
13-
Data::Struct(data_struct) => {
14-
match data_struct.fields {
15-
Fields::Named(fields) => {
16-
let field_names: Vec<_> = fields.named.iter().map(|f| &f.ident).collect();
17-
assert!(!field_names.is_empty(), "can't derive on empty field");
18-
quote! {
19-
impl #impl_generics ::skytable::query::SQParam for #name #ty_generics #where_clause {
20-
fn append_param(&self, q: &mut Vec<u8>) -> usize {
21-
let mut size = 0;
22-
#(size += ::skytable::query::SQParam::append_param(&self.#field_names, q);)*
23-
size
24-
}
13+
Data::Struct(data_struct) => match data_struct.fields {
14+
Fields::Named(fields) => {
15+
let field_names: Vec<_> = fields.named.iter().map(|f| &f.ident).collect();
16+
assert!(!field_names.is_empty(), "can't derive on empty field");
17+
quote! {
18+
impl #impl_generics ::skytable::query::SQParam for #name #ty_generics #where_clause {
19+
fn append_param(&self, q: &mut Vec<u8>) -> usize {
20+
let mut size = 0;
21+
#(size += ::skytable::query::SQParam::append_param(&self.#field_names, q);)*
22+
size
2523
}
2624
}
27-
},
28-
_ => unimplemented!(),
25+
}
2926
}
27+
_ => unimplemented!(),
3028
},
3129
_ => unimplemented!(),
3230
};
@@ -39,24 +37,26 @@ pub fn derive_response(input: TokenStream) -> TokenStream {
3937
let name = input.ident;
4038
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
4139
let ret = match input.data {
42-
Data::Struct(data_struct) => {
43-
match data_struct.fields {
44-
Fields::Named(fields) => {
45-
let field_names: Vec<_> = fields.named.iter().map(|f| &f.ident).collect();
46-
assert!(!field_names.is_empty(), "can't derive on empty field");
47-
let tuple_pattern = quote! { (#(#field_names),*) };
48-
let struct_instantiation = quote! { Self { #(#field_names),* } };
49-
quote! {
50-
impl #impl_generics skytable::response::FromResponse for #name #ty_generics #where_clause {
51-
fn from_response(resp: skytable::response::Response) -> skytable::ClientResult<Self> {
52-
let #tuple_pattern = skytable::response::FromResponse::from_response(resp)?;
53-
Ok(#struct_instantiation)
54-
}
40+
Data::Struct(data_struct) => match data_struct.fields {
41+
Fields::Named(fields) => {
42+
let field_names: Vec<_> = fields.named.iter().map(|f| &f.ident).collect();
43+
assert!(!field_names.is_empty(), "can't derive on empty field");
44+
let tuple_pattern = if field_names.len() == 1 {
45+
quote! { quote! { (#(#field_names),*,) } }
46+
} else {
47+
quote! { (#(#field_names),*) }
48+
};
49+
let struct_instantiation = quote! { Self { #(#field_names),* } };
50+
quote! {
51+
impl #impl_generics skytable::response::FromResponse for #name #ty_generics #where_clause {
52+
fn from_response(resp: skytable::response::Response) -> skytable::ClientResult<Self> {
53+
let #tuple_pattern = skytable::response::FromResponse::from_response(resp)?;
54+
Ok(#struct_instantiation)
5555
}
5656
}
57-
},
58-
_ => unimplemented!(),
57+
}
5958
}
59+
_ => unimplemented!(),
6060
},
6161
_ => unimplemented!(),
6262
};

0 commit comments

Comments
 (0)