bon_macros/collections/
set.rs

1use crate::util::prelude::*;
2use syn::punctuated::Punctuated;
3use syn::{Expr, Token};
4
5pub(crate) fn generate(entries: Punctuated<Expr, Token![,]>) -> TokenStream {
6    let error = super::validate_expressions_are_unique("value in the set", &entries);
7    let entries = entries.into_iter();
8    let output = quote! {
9        ::core::iter::FromIterator::from_iter([
10            #(::core::convert::Into::into(#entries)),*
11        ])
12    };
13
14    // We unconditionally return `output` as part of the result to make sure IDEs
15    // see this output and see what input tokens map to what output tokens. This
16    // way IDEs can provide better help to the developer even when there are errors.
17    error
18        .map(|err| {
19            let err = err.write_errors();
20            quote! {{
21                #err
22                #output
23            }}
24        })
25        .unwrap_or(output)
26}