Skip to content

Commit 53d62c3

Browse files
committed
Add tests, fix error messages
1 parent eaaa700 commit 53d62c3

File tree

7 files changed

+58
-5
lines changed

7 files changed

+58
-5
lines changed

sqlx-macros-core/src/derives/attributes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ pub fn check_struct_attributes(
281281

282282
assert_attribute!(
283283
!attributes.transparent,
284-
"unexpected #[sqlx(transparent)]",
284+
"#[sqlx(transparent)] is only valid for structs with exactly one field",
285285
input
286286
);
287287

sqlx-macros-core/src/derives/decode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn expand_derive_decode(input: &DeriveInput) -> syn::Result<TokenStream> {
3434
..
3535
}) => Err(syn::Error::new_spanned(
3636
input,
37-
"structs with zero or more than one unnamed field are not supported",
37+
"tuple structs may only have a single field",
3838
)),
3939
Data::Struct(DataStruct {
4040
fields: Fields::Unit,

sqlx-macros-core/src/derives/encode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn expand_derive_encode(input: &DeriveInput) -> syn::Result<TokenStream> {
3535
..
3636
}) => Err(syn::Error::new_spanned(
3737
input,
38-
"structs with zero or more than one unnamed field are not supported",
38+
"tuple structs may only have a single field",
3939
)),
4040
Data::Struct(DataStruct {
4141
fields: Fields::Unit,

sqlx-macros-core/src/derives/type.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub fn expand_derive_type(input: &DeriveInput) -> syn::Result<TokenStream> {
1515
match &input.data {
1616
// Newtype structs:
1717
// struct Foo(i32);
18+
// struct Foo { field: i32 };
1819
Data::Struct(DataStruct { fields, .. })
1920
if fields.len() == 1 && (matches!(fields, Fields::Unnamed(_)) || attrs.transparent) =>
2021
{
@@ -31,7 +32,7 @@ pub fn expand_derive_type(input: &DeriveInput) -> syn::Result<TokenStream> {
3132
..
3233
}) => Err(syn::Error::new_spanned(
3334
input,
34-
"structs with zero or more than one unnamed field are not supported",
35+
"tuple structs may only have a single field",
3536
)),
3637
Data::Struct(DataStruct {
3738
fields: Fields::Unit,

tests/mysql/derives.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,23 @@ async fn test_derive_weak_enum() -> anyhow::Result<()> {
300300

301301
Ok(())
302302
}
303+
304+
#[derive(PartialEq, Eq, Debug, sqlx::Type)]
305+
#[sqlx(transparent)]
306+
struct TransparentTuple(i64);
307+
308+
#[derive(PartialEq, Eq, Debug, sqlx::Type)]
309+
#[sqlx(transparent)]
310+
struct TransparentNamed {
311+
field: i64,
312+
}
313+
314+
test_type!(transparent_tuple<TransparentTuple>(Mysql,
315+
"0" == TransparentTuple(0),
316+
"23523" == TransparentTuple(23523)
317+
));
318+
319+
test_type!(transparent_named<TransparentNamed>(Mysql,
320+
"0" == TransparentNamed { field: 0 },
321+
"23523" == TransparentNamed { field: 23523 },
322+
));

tests/postgres/derives.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ use std::ops::Bound;
1212
#[sqlx(transparent)]
1313
struct Transparent(i32);
1414

15+
// Also possible for single-field named structs
16+
#[derive(PartialEq, Debug, sqlx::Type)]
17+
#[sqlx(transparent)]
18+
struct TransparentNamed {
19+
field: i32,
20+
}
21+
1522
#[derive(PartialEq, Debug, sqlx::Type)]
1623
// https://github.com/launchbadge/sqlx/issues/2611
1724
// Previously, the derive would generate a `PgHasArrayType` impl that errored on an
@@ -143,11 +150,16 @@ struct FloatRange(PgRange<f64>);
143150
#[sqlx(type_name = "int4rangeL0pC")]
144151
struct RangeInclusive(PgRange<i32>);
145152

146-
test_type!(transparent<Transparent>(Postgres,
153+
test_type!(transparent_tuple<Transparent>(Postgres,
147154
"0" == Transparent(0),
148155
"23523" == Transparent(23523)
149156
));
150157

158+
test_type!(transparent_named<TransparentNamed>(Postgres,
159+
"0" == TransparentNamed { field: 0 },
160+
"23523" == TransparentNamed { field: 23523 },
161+
));
162+
151163
test_type!(transparent_array<TransparentArray>(Postgres,
152164
"'{}'::int8[]" == TransparentArray(vec![]),
153165
"'{ 23523, 123456, 789 }'::int8[]" == TransparentArray(vec![23523, 123456, 789])

tests/sqlite/derives.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,23 @@ test_type!(origin_enum<Origin>(Sqlite,
1212
"1" == Origin::Foo,
1313
"2" == Origin::Bar,
1414
));
15+
16+
#[derive(PartialEq, Eq, Debug, sqlx::Type)]
17+
#[sqlx(transparent)]
18+
struct TransparentTuple(i64);
19+
20+
#[derive(PartialEq, Eq, Debug, sqlx::Type)]
21+
#[sqlx(transparent)]
22+
struct TransparentNamed {
23+
field: i64,
24+
}
25+
26+
test_type!(transparent_tuple<TransparentTuple>(Sqlite,
27+
"0" == TransparentTuple(0),
28+
"23523" == TransparentTuple(23523)
29+
));
30+
31+
test_type!(transparent_named<TransparentNamed>(Sqlite,
32+
"0" == TransparentNamed { field: 0 },
33+
"23523" == TransparentNamed { field: 23523 },
34+
));

0 commit comments

Comments
 (0)