Fix handling of raw ident fields in derive
This commit is contained in:
@@ -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')")]);
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
})
|
||||
|
||||
@@ -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<_>>();
|
||||
|
||||
Reference in New Issue
Block a user