Skip to content

Commit 986de01

Browse files
opusbopustyt2y3
opusbopus
authored andcommitted
Migrate sea-query-derive to syn 2.0 (#707)
1 parent ee4aa6c commit 986de01

File tree

3 files changed

+45
-37
lines changed

3 files changed

+45
-37
lines changed

sea-query-derive/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ rust-version = "1.60"
1515
proc-macro = true
1616

1717
[dependencies]
18-
syn = { version = "1", default-features = false, features = ["parsing", "proc-macro", "derive", "printing"] }
18+
syn = { version = "2", default-features = false, features = ["parsing", "proc-macro", "derive", "printing"] }
1919
quote = { version = "1", default-features = false }
2020
heck = { version = "0.4", default-features = false }
2121
proc-macro2 = { version = "1", default-features = false }

sea-query-derive/src/iden_attr.rs

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::convert::{TryFrom, TryInto};
22

3-
use syn::{Attribute, Error, Ident, Lit, Meta, MetaNameValue, NestedMeta};
3+
use syn::spanned::Spanned;
4+
use syn::{Attribute, Error, Expr, ExprLit, Ident, Lit, LitStr, Meta};
45

56
use crate::{error::ErrorMsg, iden_path::IdenPath};
67

@@ -14,8 +15,13 @@ pub(crate) enum IdenAttr {
1415
impl IdenAttr {
1516
fn extract_method(meta: Meta) -> syn::Result<Self> {
1617
match meta {
17-
Meta::NameValue(nv) => match nv.lit {
18-
Lit::Str(name) => Ok(Self::Method(Ident::new(name.value().as_str(), name.span()))),
18+
Meta::NameValue(nv) => match nv.value {
19+
Expr::Lit(ExprLit { lit, .. }) => match lit {
20+
Lit::Str(name) => {
21+
Ok(Self::Method(Ident::new(name.value().as_str(), name.span())))
22+
}
23+
_ => Err(Error::new_spanned(nv.eq_token, ErrorMsg::WrongLiteral)),
24+
},
1925
_ => Err(Error::new_spanned(nv, ErrorMsg::WrongLiteral)),
2026
},
2127
a => Err(Error::new_spanned(
@@ -27,37 +33,39 @@ impl IdenAttr {
2733

2834
fn extract_iden(meta: Meta) -> syn::Result<Self> {
2935
match &meta {
30-
Meta::NameValue(nv) => match &nv.lit {
31-
Lit::Str(lit) => Ok(IdenAttr::Rename(lit.value())),
32-
_ => Err(Error::new_spanned(&nv.lit, ErrorMsg::WrongLiteral)),
33-
},
34-
Meta::List(list) => match list.nested.first() {
35-
Some(NestedMeta::Meta(Meta::Path(p))) if p.is_ident(&IdenPath::Flatten) => {
36-
Ok(IdenAttr::Flatten)
37-
}
38-
Some(NestedMeta::Meta(Meta::NameValue(nv))) => Self::extract_named_value_iden(nv),
39-
_ => Err(Error::new_spanned(meta, ErrorMsg::WrongListFormat)),
36+
Meta::NameValue(nv) => match &nv.value {
37+
Expr::Lit(ExprLit { lit, .. }) => match lit {
38+
Lit::Str(lit) => Ok(IdenAttr::Rename(lit.value())),
39+
_ => Err(Error::new_spanned(&nv.value, ErrorMsg::WrongLiteral)),
40+
},
41+
_ => Err(Error::new_spanned(nv, ErrorMsg::WrongLiteral)),
4042
},
41-
a => Err(Error::new_spanned(a, ErrorMsg::WrongAttributeFormat)),
42-
}
43-
}
44-
45-
fn extract_named_value_iden(nv: &MetaNameValue) -> syn::Result<Self> {
46-
match &nv.lit {
47-
Lit::Str(name) => {
48-
// Don't match "iden" since that would mean `#[iden(iden = "name")]` would be accepted
49-
if nv.path.is_ident(&IdenPath::Rename) {
50-
Ok(Self::Rename(name.value()))
51-
} else if nv.path.is_ident(&IdenPath::Method) {
52-
Ok(Self::Method(Ident::new(name.value().as_str(), name.span())))
53-
} else {
54-
Err(Error::new_spanned(
55-
nv,
56-
ErrorMsg::UnsupportedKeyword(nv.path.get_ident().unwrap().clone()),
57-
))
58-
}
43+
Meta::List(list) if list.path.is_ident("iden") => {
44+
let mut iden_attr: Option<Self> = None;
45+
list.parse_nested_meta(|nested| {
46+
if nested.path.is_ident(&IdenPath::Flatten) {
47+
iden_attr = Some(IdenAttr::Flatten);
48+
Ok(())
49+
} else if nested.path.is_ident(&IdenPath::Rename) {
50+
let value = nested.value()?;
51+
let value: LitStr = value.parse()?;
52+
iden_attr = Some(IdenAttr::Rename(value.value()));
53+
Ok(())
54+
} else if nested.path.is_ident(&IdenPath::Method) {
55+
let value = nested.value()?;
56+
let value: LitStr = value.parse()?;
57+
iden_attr = Some(IdenAttr::Method(Ident::new(&value.value(), meta.span())));
58+
Ok(())
59+
} else {
60+
Err(Error::new_spanned(
61+
&meta,
62+
ErrorMsg::UnsupportedKeyword(nested.path.get_ident().unwrap().clone()),
63+
))
64+
}
65+
})?;
66+
iden_attr.ok_or(Error::new_spanned(meta, ErrorMsg::WrongListFormat))
5967
}
60-
_ => Err(Error::new_spanned(&nv.lit, ErrorMsg::WrongLiteral)),
68+
a => Err(Error::new_spanned(a, ErrorMsg::WrongAttributeFormat)),
6169
}
6270
}
6371
}
@@ -66,7 +74,7 @@ impl TryFrom<&Attribute> for IdenAttr {
6674
type Error = Error;
6775

6876
fn try_from(value: &Attribute) -> Result<Self, Self::Error> {
69-
value.parse_meta()?.try_into()
77+
value.meta.clone().try_into()
7078
}
7179
}
7280

sea-query-derive/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ use self::{
1818
};
1919

2020
fn find_attr(attrs: &[Attribute]) -> Option<&Attribute> {
21-
attrs
22-
.iter()
23-
.find(|attr| attr.path.is_ident(&IdenPath::Iden) || attr.path.is_ident(&IdenPath::Method))
21+
attrs.iter().find(|attr| {
22+
attr.path().is_ident(&IdenPath::Iden) || attr.path().is_ident(&IdenPath::Method)
23+
})
2424
}
2525

2626
fn get_table_name(ident: &proc_macro2::Ident, attrs: Vec<Attribute>) -> Result<String, syn::Error> {

0 commit comments

Comments
 (0)