From dc591ff2ca5a51e4f7f3543e1321292b5a1dadea Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Tue, 23 Nov 2021 23:40:00 -0500 Subject: [PATCH] Fix handling of raw ident fields in derive --- postgres-derive-test/src/composites.rs | 23 +++++++++++++++++++++++ postgres-derive/src/composites.rs | 8 +++++++- postgres-derive/src/fromsql.rs | 6 +++--- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/postgres-derive-test/src/composites.rs b/postgres-derive-test/src/composites.rs index 5efd3944..ed60bf48 100644 --- a/postgres-derive-test/src/composites.rs +++ b/postgres-derive-test/src/composites.rs @@ -215,3 +215,26 @@ fn wrong_type() { .unwrap_err(); assert!(err.source().unwrap().is::()); } + +#[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')")]); +} diff --git a/postgres-derive/src/composites.rs b/postgres-derive/src/composites.rs index f5599d37..c1e49515 100644 --- a/postgres-derive/src/composites.rs +++ b/postgres-derive/src/composites.rs @@ -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(), }) diff --git a/postgres-derive/src/fromsql.rs b/postgres-derive/src/fromsql.rs index e1ab6ffa..3a59d622 100644 --- a/postgres-derive/src/fromsql.rs +++ b/postgres-derive/src/fromsql.rs @@ -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::>(); let field_names = &fields.iter().map(|f| &f.name).collect::>(); let field_idents = &fields.iter().map(|f| &f.ident).collect::>();