Fix handling of raw ident fields in derive

This commit is contained in:
Steven Fackler
2021-11-23 23:40:00 -05:00
parent 84fa5fa1d0
commit dc591ff2ca
3 changed files with 33 additions and 4 deletions

View File

@@ -215,3 +215,26 @@ fn wrong_type() {
.unwrap_err();
assert!(err.source().unwrap().is::<WrongType>());
}
#[test]
fn raw_ident_field() {
#[derive(FromSql, ToSql, Debug, PartialEq)]
#[postgres(name = "inventory_item")]
struct InventoryItem {
r#type: String,
}
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
conn.batch_execute(
"CREATE TYPE pg_temp.inventory_item AS (
type TEXT
)",
)
.unwrap();
let item = InventoryItem {
r#type: "foo".to_owned(),
};
test_type(&mut conn, "inventory_item", &[(item, "ROW('foo')")]);
}

View File

@@ -14,7 +14,13 @@ impl Field {
let ident = raw.ident.as_ref().unwrap().clone();
Ok(Field {
name: overrides.name.unwrap_or_else(|| ident.to_string()),
name: overrides.name.unwrap_or_else(|| {
let name = ident.to_string();
match name.strip_prefix("r#") {
Some(name) => name.to_string(),
None => name,
}
}),
ident,
type_: raw.ty.clone(),
})

View File

@@ -1,5 +1,5 @@
use proc_macro2::{Span, TokenStream};
use quote::quote;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use std::iter;
use syn::{Data, DataStruct, DeriveInput, Error, Fields, Ident};
@@ -119,7 +119,7 @@ fn domain_body(ident: &Ident, field: &syn::Field) -> TokenStream {
fn composite_body(ident: &Ident, fields: &[Field]) -> TokenStream {
let temp_vars = &fields
.iter()
.map(|f| Ident::new(&format!("__{}", f.ident), Span::call_site()))
.map(|f| format_ident!("__{}", f.ident))
.collect::<Vec<_>>();
let field_names = &fields.iter().map(|f| &f.name).collect::<Vec<_>>();
let field_idents = &fields.iter().map(|f| &f.ident).collect::<Vec<_>>();