summaryrefslogtreecommitdiff
path: root/gen_random_proc_macro/src
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-12-15 11:33:32 -0500
committerpommicket <pommicket@gmail.com>2022-12-15 11:33:32 -0500
commit4f48f02f91f2134b4452729dd96524ea1814efb2 (patch)
tree2af6a435a33119bb2169cdec48da7a71c6bf0437 /gen_random_proc_macro/src
parente45cbe4744c76a160e012a4d9bcf8d46340821d8 (diff)
various fixes
Diffstat (limited to 'gen_random_proc_macro/src')
-rw-r--r--gen_random_proc_macro/src/lib.rs38
1 files changed, 20 insertions, 18 deletions
diff --git a/gen_random_proc_macro/src/lib.rs b/gen_random_proc_macro/src/lib.rs
index 5e28e16..9b7a771 100644
--- a/gen_random_proc_macro/src/lib.rs
+++ b/gen_random_proc_macro/src/lib.rs
@@ -19,7 +19,7 @@ pub fn gen_random_derive(input: TokenStream) -> TokenStream {
impl_gen_random(&ast)
}
-fn get_attribute_literal(attrs: &[syn::Attribute], name: &str) -> Option<proc_macro2::Literal> {
+fn get_attribute(attrs: &[syn::Attribute], name: &str) -> Option<proc_macro2::TokenStream> {
let attr = attrs.iter().find(|a| {
let path = &a.path;
if let Some(ident) = path.get_ident() {
@@ -30,25 +30,27 @@ fn get_attribute_literal(attrs: &[syn::Attribute], name: &str) -> Option<proc_ma
})?;
let tokens: TokenStream2 = attr.tokens.clone().into();
- let mut tokens: Vec<TokenTree2> = tokens.into_iter().collect();
- if tokens.len() != 2 {
- panic!("Expected {name} = <value>");
+ let tokens: Vec<TokenTree2> = tokens.into_iter().collect();
+ if tokens.len() != 1 {
+ panic!("Expected {name}(<value>)");
}
- use TokenTree2::{Punct, Literal};
- match &tokens[0] {
- Punct(equals) if equals.as_char() == '=' => {}
- _ => panic!("Expected = after {name} attribute"),
+ use TokenTree2::Group;
+ use proc_macro2::Delimiter;
+ let value = match &tokens[0] {
+ Group(g) if g.delimiter() == Delimiter::Parenthesis => {
+ g.stream()
+ },
+ _ => {
+ panic!("Expected {name}(<value>)");
+ },
};
- let Literal(literal) = tokens.remove(1) else {
- panic!("Bad value for {name} attribute.");
- };
- Some(literal)
+ Some(value)
}
fn parse_attribute_value<T: FromStr>(attrs: &[syn::Attribute], name: &str) -> Option<T> {
- let literal = get_attribute_literal(attrs, name)?;
- let Ok(value) = literal.to_string().parse() else {
+ let stream = get_attribute(attrs, name)?;
+ let Ok(value) = stream.to_string().parse() else {
panic!("Bad {} for {name} attribute", type_name::<T>())
};
Some(value)
@@ -63,11 +65,11 @@ fn generate_fields(fields: &syn::Fields) -> impl quote::ToTokens {
let ty = &field.ty;
field_values.extend(quote! { <#ty as GenRandom>::gen_random_max_depth(rng, _depth - 1) });
- if let Some(scale) = get_attribute_literal(&field.attrs, "scale") {
- field_values.extend(quote! { * #scale });
+ if let Some(scale) = get_attribute(&field.attrs, "scale") {
+ field_values.extend(quote! { * ( #scale ) });
}
- if let Some(bias) = get_attribute_literal(&field.attrs, "bias") {
- field_values.extend(quote! { + #bias });
+ if let Some(bias) = get_attribute(&field.attrs, "bias") {
+ field_values.extend(quote! { + ( #bias ) });
}
field_values.extend(quote! { , });