Skip to content

Commit dc591ff

Browse files
committed
Fix handling of raw ident fields in derive
1 parent 84fa5fa commit dc591ff

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

postgres-derive-test/src/composites.rs

+23
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,26 @@ fn wrong_type() {
215215
.unwrap_err();
216216
assert!(err.source().unwrap().is::<WrongType>());
217217
}
218+
219+
#[test]
220+
fn raw_ident_field() {
221+
#[derive(FromSql, ToSql, Debug, PartialEq)]
222+
#[postgres(name = "inventory_item")]
223+
struct InventoryItem {
224+
r#type: String,
225+
}
226+
227+
let mut conn = Client::connect("user=postgres host=localhost port=5433", NoTls).unwrap();
228+
conn.batch_execute(
229+
"CREATE TYPE pg_temp.inventory_item AS (
230+
type TEXT
231+
)",
232+
)
233+
.unwrap();
234+
235+
let item = InventoryItem {
236+
r#type: "foo".to_owned(),
237+
};
238+
239+
test_type(&mut conn, "inventory_item", &[(item, "ROW('foo')")]);
240+
}

postgres-derive/src/composites.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ impl Field {
1414

1515
let ident = raw.ident.as_ref().unwrap().clone();
1616
Ok(Field {
17-
name: overrides.name.unwrap_or_else(|| ident.to_string()),
17+
name: overrides.name.unwrap_or_else(|| {
18+
let name = ident.to_string();
19+
match name.strip_prefix("r#") {
20+
Some(name) => name.to_string(),
21+
None => name,
22+
}
23+
}),
1824
ident,
1925
type_: raw.ty.clone(),
2026
})

postgres-derive/src/fromsql.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use proc_macro2::{Span, TokenStream};
2-
use quote::quote;
1+
use proc_macro2::TokenStream;
2+
use quote::{format_ident, quote};
33
use std::iter;
44
use syn::{Data, DataStruct, DeriveInput, Error, Fields, Ident};
55

@@ -119,7 +119,7 @@ fn domain_body(ident: &Ident, field: &syn::Field) -> TokenStream {
119119
fn composite_body(ident: &Ident, fields: &[Field]) -> TokenStream {
120120
let temp_vars = &fields
121121
.iter()
122-
.map(|f| Ident::new(&format!("__{}", f.ident), Span::call_site()))
122+
.map(|f| format_ident!("__{}", f.ident))
123123
.collect::<Vec<_>>();
124124
let field_names = &fields.iter().map(|f| &f.name).collect::<Vec<_>>();
125125
let field_idents = &fields.iter().map(|f| &f.ident).collect::<Vec<_>>();

0 commit comments

Comments
 (0)