Merge remote-tracking branch 'fest-im/master'
This commit is contained in:
		
						commit
						1ac3236a9e
					
				| @ -15,7 +15,7 @@ quote = "0.6.10" | ||||
| ruma-api = "0.6.0" | ||||
| 
 | ||||
| [dependencies.syn] | ||||
| version = "0.14" | ||||
| version = "0.15.22" | ||||
| features = ["full"] | ||||
| 
 | ||||
| [dependencies.proc-macro2] | ||||
|  | ||||
| @ -25,7 +25,7 @@ impl From<Vec<FieldValue>> for Metadata { | ||||
|                 _ => panic!("expected Member::Named"), | ||||
|             }; | ||||
| 
 | ||||
|             match identifier.to_string().as_ref() { | ||||
|             match &identifier.to_string()[..] { | ||||
|                 "description" => { | ||||
|                     let expr_lit = match field_value.expr { | ||||
|                         Expr::Lit(expr_lit) => expr_lit, | ||||
|  | ||||
| @ -1,8 +1,7 @@ | ||||
| use proc_macro2::{Span, TokenStream}; | ||||
| use quote::{ToTokens, TokenStreamExt}; | ||||
| use syn::punctuated::Punctuated; | ||||
| use syn::synom::Synom; | ||||
| use syn::{Field, FieldValue, Ident, Meta}; | ||||
| use syn::{braced, Field, FieldValue, Ident, Meta, Token}; | ||||
| use syn::parse::{Parse, ParseStream, Result}; | ||||
| 
 | ||||
| mod metadata; | ||||
| mod request; | ||||
| @ -24,7 +23,7 @@ pub fn strip_serde_attrs(field: &Field) -> Field { | ||||
|             _ => return true, | ||||
|         }; | ||||
| 
 | ||||
|         if meta_list.ident == "serde" { | ||||
|         if &meta_list.ident.to_string() == "serde" { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
| @ -446,8 +445,13 @@ impl ToTokens for Api { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| type ParseMetadata = Punctuated<FieldValue, Token![,]>; | ||||
| type ParseFields = Punctuated<Field, Token![,]>; | ||||
| mod kw { | ||||
|     use syn::custom_keyword; | ||||
| 
 | ||||
|     custom_keyword!(metadata); | ||||
|     custom_keyword!(request); | ||||
|     custom_keyword!(response); | ||||
| } | ||||
| 
 | ||||
| pub struct RawApi { | ||||
|     pub metadata: Vec<FieldValue>, | ||||
| @ -455,18 +459,33 @@ pub struct RawApi { | ||||
|     pub response: Vec<Field>, | ||||
| } | ||||
| 
 | ||||
| impl Synom for RawApi { | ||||
|     named!(parse -> Self, do_parse!( | ||||
|         custom_keyword!(metadata) >> | ||||
|         metadata: braces!(ParseMetadata::parse_terminated) >> | ||||
|         custom_keyword!(request) >> | ||||
|         request: braces!(call!(ParseFields::parse_terminated_with, Field::parse_named)) >> | ||||
|         custom_keyword!(response) >> | ||||
|         response: braces!(call!(ParseFields::parse_terminated_with, Field::parse_named)) >> | ||||
|         (RawApi { | ||||
|             metadata: metadata.1.into_iter().collect(), | ||||
|             request: request.1.into_iter().collect(), | ||||
|             response: response.1.into_iter().collect(), | ||||
| impl Parse for RawApi { | ||||
|     fn parse(input: ParseStream) -> Result<Self> { | ||||
|         input.parse::<kw::metadata>()?; | ||||
|         let metadata; | ||||
|         braced!(metadata in input); | ||||
| 
 | ||||
|         input.parse::<kw::request>()?; | ||||
|         let request; | ||||
|         braced!(request in input); | ||||
| 
 | ||||
|         input.parse::<kw::response>()?; | ||||
|         let response; | ||||
|         braced!(response in input); | ||||
| 
 | ||||
|         Ok(RawApi { | ||||
|             metadata: metadata | ||||
|                 .parse_terminated::<FieldValue, Token![,]>(FieldValue::parse)? | ||||
|                 .into_iter() | ||||
|                 .collect(), | ||||
|             request: request | ||||
|                 .parse_terminated::<Field, Token![,]>(Field::parse_named)? | ||||
|                 .into_iter() | ||||
|                 .collect(), | ||||
|             response: response | ||||
|                 .parse_terminated::<Field, Token![,]>(Field::parse_named)? | ||||
|                 .into_iter() | ||||
|                 .collect(), | ||||
|         }) | ||||
|     )); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| use proc_macro2::{Span, TokenStream}; | ||||
| use quote::{TokenStreamExt, ToTokens}; | ||||
| use quote::{ToTokens, TokenStreamExt}; | ||||
| use syn::spanned::Spanned; | ||||
| use syn::{Field, Ident, Lit, Meta, NestedMeta}; | ||||
| 
 | ||||
| @ -153,7 +153,7 @@ impl From<Vec<Field>> for Request { | ||||
|                     _ => return true, | ||||
|                 }; | ||||
| 
 | ||||
|                 if meta_list.ident != "ruma_api" { | ||||
|                 if &meta_list.ident.to_string() != "ruma_api" { | ||||
|                     return true; | ||||
|                 } | ||||
| 
 | ||||
| @ -162,7 +162,7 @@ impl From<Vec<Field>> for Request { | ||||
|                         NestedMeta::Meta(meta_item) => { | ||||
|                             match meta_item { | ||||
|                                 Meta::Word(ident) => { | ||||
|                                     match ident.to_string().as_ref() { | ||||
|                                     match &ident.to_string()[..] { | ||||
|                                         "body" => { | ||||
|                                             has_newtype_body = true; | ||||
|                                             field_kind = RequestFieldKind::NewtypeBody; | ||||
| @ -173,7 +173,7 @@ impl From<Vec<Field>> for Request { | ||||
|                                     } | ||||
|                                 } | ||||
|                                 Meta::NameValue(name_value) => { | ||||
|                                     match name_value.ident.to_string().as_ref() { | ||||
|                                     match &name_value.ident.to_string()[..] { | ||||
|                                         "header" => { | ||||
|                                             match name_value.lit { | ||||
|                                                 Lit::Str(lit_str) => header = Some(lit_str.value()), | ||||
|  | ||||
| @ -32,7 +32,10 @@ impl Response { | ||||
|         for response_field in self.fields.iter() { | ||||
|             match *response_field { | ||||
|                 ResponseField::Body(ref field) => { | ||||
|                     let field_name = field.ident.as_ref().expect("expected field to have an identifier"); | ||||
|                     let field_name = field | ||||
|                         .ident | ||||
|                         .clone() | ||||
|                         .expect("expected field to have an identifier"); | ||||
|                     let span = field.span(); | ||||
| 
 | ||||
|                     tokens.append_all(quote_spanned! {span=> | ||||
| @ -40,7 +43,10 @@ impl Response { | ||||
|                     }); | ||||
|                 } | ||||
|                 ResponseField::Header(ref field, ref header) => { | ||||
|                     let field_name = field.ident.as_ref().expect("expected field to have an identifier"); | ||||
|                     let field_name = field | ||||
|                         .ident | ||||
|                         .clone() | ||||
|                         .expect("expected field to have an identifier"); | ||||
|                     let header_name = Ident::new(header.as_ref(), Span::call_site()); | ||||
|                     let span = field.span(); | ||||
| 
 | ||||
| @ -53,7 +59,10 @@ impl Response { | ||||
|                     }); | ||||
|                 } | ||||
|                 ResponseField::NewtypeBody(ref field) => { | ||||
|                     let field_name = field.ident.as_ref().expect("expected field to have an identifier"); | ||||
|                     let field_name = field | ||||
|                         .ident | ||||
|                         .clone() | ||||
|                         .expect("expected field to have an identifier"); | ||||
|                     let span = field.span(); | ||||
| 
 | ||||
|                     tokens.append_all(quote_spanned! {span=> | ||||
| @ -140,7 +149,7 @@ impl From<Vec<Field>> for Response { | ||||
|                     _ => return true, | ||||
|                 }; | ||||
| 
 | ||||
|                 if meta_list.ident != "ruma_api" { | ||||
|                 if &meta_list.ident.to_string() != "ruma_api" { | ||||
|                     return true; | ||||
|                 } | ||||
| 
 | ||||
| @ -149,7 +158,7 @@ impl From<Vec<Field>> for Response { | ||||
|                         NestedMeta::Meta(meta_item) => { | ||||
|                             match meta_item { | ||||
|                                 Meta::Word(ident) => { | ||||
|                                     match ident.to_string().as_ref() { | ||||
|                                     match &ident.to_string()[..] { | ||||
|                                         "body" => { | ||||
|                                             has_newtype_body = true; | ||||
|                                             field_kind = ResponseFieldKind::NewtypeBody; | ||||
| @ -158,7 +167,7 @@ impl From<Vec<Field>> for Response { | ||||
|                                     } | ||||
|                                 } | ||||
|                                 Meta::NameValue(name_value) => { | ||||
|                                     match name_value.ident.to_string().as_ref() { | ||||
|                                     match &name_value.ident.to_string()[..] { | ||||
|                                         "header" => { | ||||
|                                             match name_value.lit { | ||||
|                                                 Lit::Str(lit_str) => header = Some(lit_str.value()), | ||||
|  | ||||
| @ -10,7 +10,7 @@ extern crate proc_macro; | ||||
| extern crate proc_macro2; | ||||
| #[macro_use] extern crate quote; | ||||
| extern crate ruma_api; | ||||
| #[macro_use] extern crate syn; | ||||
| extern crate syn; | ||||
| 
 | ||||
| use proc_macro::TokenStream; | ||||
| 
 | ||||
| @ -203,7 +203,7 @@ mod api; | ||||
| /// ```
 | ||||
| #[proc_macro] | ||||
| pub fn ruma_api(input: TokenStream) -> TokenStream { | ||||
|     let raw_api: RawApi = syn::parse(input).expect("ruma_api! failed to parse input"); | ||||
|     let raw_api = syn::parse_macro_input!(input as RawApi); | ||||
| 
 | ||||
|     let api = Api::from(raw_api); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user