Parse url and return url token stream. A URL can be an expression.
(attr: &TokenStream)
| 9 | /// Parse url and return url token stream. |
| 10 | /// A URL can be an expression. |
| 11 | pub fn parse_url_stream(attr: &TokenStream) -> syn::Result<proc_macro2::TokenStream> { |
| 12 | let attr_str = attr.to_string(); |
| 13 | if attr_str.is_empty() { |
| 14 | return Err(syn::Error::new( |
| 15 | proc_macro2::Span::call_site(), |
| 16 | "no metadata assign", |
| 17 | )); |
| 18 | } |
| 19 | |
| 20 | let attrs = attr_str.split(","); |
| 21 | let exprs: Vec<&str> = attrs.into_iter().map(|u| u).collect(); |
| 22 | // The default starting expression is the URL. |
| 23 | if let Some(expr_str) = exprs.first() { |
| 24 | let expr_str = expr_str.trim(); |
| 25 | let url_expr = syn::parse::<syn::Expr>(TokenStream::from_str(expr_str).unwrap())?; |
| 26 | let url_stream = parse_url(&url_expr)?; |
| 27 | |
| 28 | // Skip the url. |
| 29 | for i in 1..exprs.len() { |
| 30 | let exp_str = exprs[i].trim(); |
| 31 | let url_expr = syn::parse::<syn::Expr>(TokenStream::from_str(exp_str).unwrap())?; |
| 32 | |
| 33 | match url_expr { |
| 34 | // An assignment path: path = xxx. |
| 35 | syn::Expr::Assign(assign) => { |
| 36 | let left = &assign.left; |
| 37 | if let syn::Expr::Path(ref k) = **left { |
| 38 | let key = k.path.segments.last().unwrap().ident.to_string(); |
| 39 | if key == "path" { |
| 40 | let right = &assign.right; |
| 41 | // Url + path. |
| 42 | return Ok(quote!(#url_stream .to_string() + #right)); |
| 43 | } |
| 44 | } |
| 45 | } |
| 46 | _ => {} |
| 47 | } |
| 48 | } |
| 49 | return Ok(quote!(#url_stream .to_string())); |
| 50 | } |
| 51 | Err(syn::Error::new( |
| 52 | proc_macro2::Span::call_site(), |
| 53 | "no metadata assign", |
| 54 | )) |
| 55 | } |
| 56 | |
| 57 | /// Parse and validate the url. |
| 58 | pub fn parse_url(url_expr: &syn::Expr) -> syn::Result<proc_macro2::TokenStream> { |
no test coverage detected