mirror of https://github.com/zkat/miette.git
feat(collection): chain iterators rather than extend vector
Since we are going to iterate anyway, instead of growing the label vector, chain the iterators. This should be more efficient. In some cases, this also remove a compilation warning about the label vector being unnecessarily mutable.
This commit is contained in:
parent
d144f7a28e
commit
85576d7914
|
|
@ -162,7 +162,6 @@ impl Labels {
|
||||||
|
|
||||||
pub(crate) fn gen_struct(&self, fields: &syn::Fields) -> Option<TokenStream> {
|
pub(crate) fn gen_struct(&self, fields: &syn::Fields) -> Option<TokenStream> {
|
||||||
let (display_pat, display_members) = display_pat_members(fields);
|
let (display_pat, display_members) = display_pat_members(fields);
|
||||||
let labels_gen_var = quote! { labels };
|
|
||||||
let labels = self.0.iter().filter_map(|highlight| {
|
let labels = self.0.iter().filter_map(|highlight| {
|
||||||
let Label {
|
let Label {
|
||||||
span,
|
span,
|
||||||
|
|
@ -194,7 +193,7 @@ impl Labels {
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
let collections = self.0.iter().filter_map(|label| {
|
let collections_chain = self.0.iter().filter_map(|label| {
|
||||||
let Label {
|
let Label {
|
||||||
span,
|
span,
|
||||||
label,
|
label,
|
||||||
|
|
@ -211,18 +210,20 @@ impl Labels {
|
||||||
quote! { std::option::Option::None }
|
quote! { std::option::Option::None }
|
||||||
};
|
};
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
let display = #display;
|
.chain({
|
||||||
#labels_gen_var.extend(self.#span.iter().map(|label| {
|
let display = #display;
|
||||||
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
|
self.#span.iter().map(move |label| {
|
||||||
.map(|span| {
|
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
|
||||||
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
|
.map(|span| {
|
||||||
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
|
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
|
||||||
if display.is_some() && labeled_span.label().is_none() {
|
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
|
||||||
labeled_span.set_label(display.clone())
|
if display.is_some() && labeled_span.label().is_none() {
|
||||||
}
|
labeled_span.set_label(display.clone())
|
||||||
labeled_span
|
}
|
||||||
})
|
labeled_span
|
||||||
}));
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -232,12 +233,13 @@ impl Labels {
|
||||||
use miette::macro_helpers::ToOption;
|
use miette::macro_helpers::ToOption;
|
||||||
let Self #display_pat = self;
|
let Self #display_pat = self;
|
||||||
|
|
||||||
let mut #labels_gen_var = vec![
|
let labels_iter = vec![
|
||||||
#(#labels),*
|
#(#labels),*
|
||||||
];
|
]
|
||||||
#(#collections)*
|
.into_iter()
|
||||||
|
#(#collections_chain)*;
|
||||||
|
|
||||||
std::option::Option::Some(Box::new(#labels_gen_var.into_iter().filter(Option::is_some).map(Option::unwrap)))
|
std::option::Option::Some(Box::new(labels_iter.filter(Option::is_some).map(Option::unwrap)))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -249,7 +251,6 @@ impl Labels {
|
||||||
|ident, fields, DiagnosticConcreteArgs { labels, .. }| {
|
|ident, fields, DiagnosticConcreteArgs { labels, .. }| {
|
||||||
let (display_pat, display_members) = display_pat_members(fields);
|
let (display_pat, display_members) = display_pat_members(fields);
|
||||||
labels.as_ref().and_then(|labels| {
|
labels.as_ref().and_then(|labels| {
|
||||||
let labels_gen_var = quote! { labels };
|
|
||||||
let variant_labels = labels.0.iter().filter_map(|label| {
|
let variant_labels = labels.0.iter().filter_map(|label| {
|
||||||
let Label { span, label, ty, lbl_ty } = label;
|
let Label { span, label, ty, lbl_ty } = label;
|
||||||
if *lbl_ty == LabelType::Collection {
|
if *lbl_ty == LabelType::Collection {
|
||||||
|
|
@ -282,7 +283,7 @@ impl Labels {
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
let collections = labels.0.iter().filter_map(|label| {
|
let collections_chain = labels.0.iter().filter_map(|label| {
|
||||||
let Label { span, label, ty, lbl_ty } = label;
|
let Label { span, label, ty, lbl_ty } = label;
|
||||||
if *lbl_ty != LabelType::Collection {
|
if *lbl_ty != LabelType::Collection {
|
||||||
return None;
|
return None;
|
||||||
|
|
@ -300,18 +301,20 @@ impl Labels {
|
||||||
quote! { std::option::Option::None }
|
quote! { std::option::Option::None }
|
||||||
};
|
};
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
let display = #display;
|
.chain({
|
||||||
#labels_gen_var.extend(#field.iter().map(|label| {
|
let display = #display;
|
||||||
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
|
#field.iter().map(move |label| {
|
||||||
.map(|span| {
|
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
|
||||||
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
|
.map(|span| {
|
||||||
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
|
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
|
||||||
if display.is_some() && labeled_span.label().is_none() {
|
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
|
||||||
labeled_span.set_label(display.clone())
|
if display.is_some() && labeled_span.label().is_none() {
|
||||||
}
|
labeled_span.set_label(display.clone());
|
||||||
labeled_span
|
}
|
||||||
})
|
labeled_span
|
||||||
}));
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
let variant_name = ident.clone();
|
let variant_name = ident.clone();
|
||||||
|
|
@ -320,11 +323,12 @@ impl Labels {
|
||||||
_ => Some(quote! {
|
_ => Some(quote! {
|
||||||
Self::#variant_name #display_pat => {
|
Self::#variant_name #display_pat => {
|
||||||
use miette::macro_helpers::ToOption;
|
use miette::macro_helpers::ToOption;
|
||||||
let mut #labels_gen_var = vec![
|
let labels_iter = vec![
|
||||||
#(#variant_labels),*
|
#(#variant_labels),*
|
||||||
];
|
]
|
||||||
#(#collections)*
|
.into_iter()
|
||||||
std::option::Option::Some(std::boxed::Box::new(#labels_gen_var.into_iter().filter(Option::is_some).map(Option::unwrap)))
|
#(#collections_chain)*;
|
||||||
|
std::option::Option::Some(std::boxed::Box::new(labels_iter.filter(Option::is_some).map(Option::unwrap)))
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue