Skip to content

Commit c6801a9

Browse files
committed
Also use tag handling for match
1 parent 30c75b5 commit c6801a9

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

src/nom_packages.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,16 +165,16 @@ pub fn apply_nom_namespaces(expr: &mut Expr) {
165165
}
166166
Expr::Lit(lit_expr) => match &lit_expr.lit {
167167
Lit::Str(value) => {
168-
*expr = match_bytes(value.value().as_bytes(), value.span());
168+
*expr = generate_tag_expression(value.value().as_bytes(), value.span());
169169
}
170170
Lit::ByteStr(value) => {
171-
*expr = match_bytes(&value.value(), value.span());
171+
*expr = generate_tag_expression(&value.value(), value.span());
172172
}
173173
Lit::Byte(value) => {
174-
*expr = match_bytes(&[value.value()], value.span());
174+
*expr = generate_tag_expression(&[value.value()], value.span());
175175
}
176176
Lit::Char(value) => {
177-
*expr = match_bytes(value.value().to_string().as_bytes(), value.span());
177+
*expr = generate_tag_expression(value.value().to_string().as_bytes(), value.span());
178178
}
179179
_ => {}
180180
},
@@ -270,7 +270,7 @@ pub fn apply_nom_namespaces(expr: &mut Expr) {
270270
}
271271
}
272272

273-
fn match_bytes(value: &[u8], span: Span) -> Expr {
273+
pub fn generate_tag_expression(value: &[u8], span: Span) -> Expr {
274274
let mut array = parse_str::<ExprArray>(format!("{:?}", value).as_str()).unwrap();
275275
array.bracket_token.span = span.into_spans();
276276
array.elems.iter_mut().for_each(|elem| {

src/settings.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use crate::fields::Field;
2-
use crate::nom_packages::apply_nom_namespaces;
2+
use crate::nom_packages::{apply_nom_namespaces, generate_tag_expression};
33
use itertools::Itertools;
44
use proc_macro::Span;
55
use proc_macro2::TokenStream;
6-
use quote::{quote, ToTokens};
6+
use quote::{quote_spanned, ToTokens};
77
use syn::parse::{Parse, ParseStream};
8+
use syn::spanned::Spanned;
89
use syn::{parse, Error, Expr, LitStr, Token};
910

1011
pub enum ParseSettings {
@@ -23,39 +24,52 @@ impl ParseSettings {
2324

2425
pub fn generate_parse_expressions(&self, fields: &[Field]) -> Vec<TokenStream> {
2526
match self {
26-
ParseSettings::Split{ prefix, split, suffix} => {
27+
ParseSettings::Split {
28+
prefix,
29+
split,
30+
suffix,
31+
} => {
2732
let mut split = split.clone();
2833
apply_nom_namespaces(&mut split);
2934

3035
let mut expressions: Vec<_> = Itertools::intersperse(
3136
fields
3237
.iter()
3338
.map(|field| field.generate_expression().into_token_stream()),
34-
quote! { let (input, _) = split.parse(input)?; },
39+
quote_spanned! { split.span() => let (input, _) = split.parse(input)?; },
3540
)
3641
.collect();
3742

3843
if let Some(prefix) = prefix {
3944
let mut prefix = prefix.clone();
4045
apply_nom_namespaces(&mut prefix);
41-
expressions.insert(0, quote! { let (input, _) = #prefix.parse(input)?; });
46+
expressions.insert(
47+
0,
48+
quote_spanned! { prefix.span() => let (input, _) = #prefix.parse(input)?; },
49+
);
4250
}
4351

4452
if let Some(suffix) = suffix {
4553
let mut suffix = suffix.clone();
4654
apply_nom_namespaces(&mut suffix);
47-
expressions.push(quote! { let (input, _) = #suffix.parse(input)?; });
55+
expressions.push(
56+
quote_spanned! { suffix.span() => let (input, _) = #suffix.parse(input)?; },
57+
);
4858
}
4959

50-
expressions.insert(0, quote! { let mut split = #split; });
60+
expressions.insert(
61+
0,
62+
quote_spanned! { split.span() => let mut split = #split; },
63+
);
5164
expressions
5265
}
5366
ParseSettings::Match(literal) => {
5467
let value = literal.value();
5568
let parts: Vec<_> = value
5669
.split("{}")
5770
.map(|part| {
58-
quote! { let (input, _) = nom::bytes::complete::tag(#part)(input)?; }
71+
let expr = generate_tag_expression(part.as_bytes(), literal.span());
72+
quote_spanned! { literal.span() => let (input, _) = #expr.parse(input)?; }
5973
})
6074
.collect();
6175

@@ -132,7 +146,10 @@ impl Parse for ParseSettings {
132146
suffix,
133147
})
134148
} else {
135-
Err(Error::new(Span::call_site().into(), "Missing `split` keyword"))
149+
Err(Error::new(
150+
Span::call_site().into(),
151+
"Missing `split` keyword",
152+
))
136153
}
137154
}
138155
}

0 commit comments

Comments
 (0)