Rewrite request and response ToTokens to avoid calls to append_all with string literals.
This commit is contained in:
		
							parent
							
								
									f6b6c94675
								
							
						
					
					
						commit
						5bc253b324
					
				| @ -135,115 +135,132 @@ impl From<Vec<Field>> for Request { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl ToTokens for Request { | impl ToTokens for Request { | ||||||
|     fn to_tokens(&self, mut tokens: &mut Tokens) { |     fn to_tokens(&self, tokens: &mut Tokens) { | ||||||
|         tokens.append_all(quote! { |         let request_struct_header = quote! { | ||||||
|             /// Data for a request to this API endpoint.
 |             /// Data for a request to this API endpoint.
 | ||||||
|             #[derive(Debug)] |             #[derive(Debug)] | ||||||
|             pub struct Request |             pub struct Request | ||||||
|         }); |         }; | ||||||
| 
 | 
 | ||||||
|         if self.fields.len() == 0 { |         let request_struct_body = if self.fields.len() == 0 { | ||||||
|             tokens.append_all(";".into_tokens()); |             quote!(;) | ||||||
|         } else { |         } else { | ||||||
|             tokens.append_all("{".into_tokens()); |             let fields = self.fields.iter().fold(Tokens::new(), |mut field_tokens, request_field| { | ||||||
| 
 |  | ||||||
|             for request_field in self.fields.iter() { |  | ||||||
|                 let field = request_field.field(); |                 let field = request_field.field(); | ||||||
|                 let span = field.span(); |                 let span = field.span(); | ||||||
| 
 | 
 | ||||||
|                 strip_serde_attrs(field).to_tokens(&mut tokens); |                 strip_serde_attrs(field); | ||||||
| 
 | 
 | ||||||
|                 tokens.append_all(quote_spanned!(span=> #field)); |                 field_tokens.append_all(quote_spanned!(span=> #field,)); | ||||||
| 
 | 
 | ||||||
|                 tokens.append_all(",".into_tokens()); |                 field_tokens | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             quote! { | ||||||
|  |                 { | ||||||
|  |                     #fields | ||||||
|                 } |                 } | ||||||
| 
 |  | ||||||
|             tokens.append_all("}".into_tokens()); |  | ||||||
|             } |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let request_body_struct; | ||||||
| 
 | 
 | ||||||
|         if let Some(newtype_body_field) = self.newtype_body_field() { |         if let Some(newtype_body_field) = self.newtype_body_field() { | ||||||
|             let mut field = newtype_body_field.clone(); |             let mut field = newtype_body_field.clone(); | ||||||
|             let ty = &field.ty; |             let ty = &field.ty; | ||||||
|             let span = field.span(); |             let span = field.span(); | ||||||
| 
 | 
 | ||||||
|             tokens.append_all(quote_spanned! {span=> |             request_body_struct = quote_spanned! {span=> | ||||||
|                 /// Data in the request body.
 |                 /// Data in the request body.
 | ||||||
|                 #[derive(Debug, Serialize)] |                 #[derive(Debug, Serialize)] | ||||||
|                 struct RequestBody(#ty); |                 struct RequestBody(#ty); | ||||||
|             }); |             }; | ||||||
|         } else if self.has_body_fields() { |         } else if self.has_body_fields() { | ||||||
|             tokens.append_all(quote! { |             let fields = self.fields.iter().fold(Tokens::new(), |mut field_tokens, request_field| { | ||||||
|                 /// Data in the request body.
 |  | ||||||
|                 #[derive(Debug, Serialize)] |  | ||||||
|                 struct RequestBody |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             tokens.append_all("{".into_tokens()); |  | ||||||
| 
 |  | ||||||
|             for request_field in self.fields.iter() { |  | ||||||
|                 match *request_field { |                 match *request_field { | ||||||
|                     RequestField::Body(ref field) => { |                     RequestField::Body(ref field) => { | ||||||
|                         let span = field.span(); |                         let span = field.span(); | ||||||
|                         tokens.append_all(quote_spanned!(span=> #field)); |  | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(",".into_tokens()); |                         field_tokens.append_all(quote_spanned!(span=> #field,)); | ||||||
|                     } |  | ||||||
|                     _ => {} |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("}".into_tokens()); |                         field_tokens | ||||||
|  |                     } | ||||||
|  |                     _ => field_tokens, | ||||||
|                 } |                 } | ||||||
| 
 |  | ||||||
|         if self.has_path_fields() { |  | ||||||
|             tokens.append_all(quote! { |  | ||||||
|                 /// Data in the request path.
 |  | ||||||
|                 #[derive(Debug, Serialize)] |  | ||||||
|                 struct RequestPath |  | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("{".into_tokens()); |             request_body_struct = quote! { | ||||||
|  |                 /// Data in the request body.
 | ||||||
|  |                 #[derive(Debug, Serialize)] | ||||||
|  |                 struct RequestBody { | ||||||
|  |                     #fields | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |         } else { | ||||||
|  |             request_body_struct = Tokens::new(); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|             for request_field in self.fields.iter() { |         let request_path_struct; | ||||||
|  | 
 | ||||||
|  |         if self.has_path_fields() { | ||||||
|  |             let fields = self.fields.iter().fold(Tokens::new(), |mut field_tokens, request_field| { | ||||||
|                 match *request_field { |                 match *request_field { | ||||||
|                     RequestField::Path(ref field) => { |                     RequestField::Path(ref field) => { | ||||||
|                         let span = field.span(); |                         let span = field.span(); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(quote_spanned!(span=> #field)); |                         field_tokens.append_all(quote_spanned!(span=> #field,)); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(",".into_tokens()); |                         field_tokens | ||||||
|                     } |                     } | ||||||
|                     _ => {} |                     _ => field_tokens, | ||||||
|                 } |                 } | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             tokens.append_all("}".into_tokens()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if self.has_query_fields() { |  | ||||||
|             tokens.append_all(quote! { |  | ||||||
|                 /// Data in the request's query string.
 |  | ||||||
|                 #[derive(Debug, Serialize)] |  | ||||||
|                 struct RequestQuery |  | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("{".into_tokens()); |             request_path_struct = quote! { | ||||||
|  |                 /// Data in the request path.
 | ||||||
|  |                 #[derive(Debug, Serialize)] | ||||||
|  |                 struct RequestPath { | ||||||
|  |                     #fields | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |         } else { | ||||||
|  |             request_path_struct = Tokens::new(); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|             for request_field in self.fields.iter() { |         let request_query_struct; | ||||||
|  | 
 | ||||||
|  |         if self.has_query_fields() { | ||||||
|  |             let fields = self.fields.iter().fold(Tokens::new(), |mut field_tokens, request_field| { | ||||||
|                 match *request_field { |                 match *request_field { | ||||||
|                     RequestField::Query(ref field) => { |                     RequestField::Query(ref field) => { | ||||||
|                         let span = field.span(); |                         let span = field.span(); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(quote_spanned!(span=> #field)); |                         field_tokens.append_all(quote_spanned!(span=> #field)); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(",".into_tokens()); |                         field_tokens | ||||||
|                     } |                     } | ||||||
|                     _ => {} |                     _ => field_tokens, | ||||||
|                 } |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             request_query_struct = quote! { | ||||||
|  |                 /// Data in the request's query string.
 | ||||||
|  |                 #[derive(Debug, Serialize)] | ||||||
|  |                 struct RequestQuery { | ||||||
|  |                     #fields | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |         } else { | ||||||
|  |             request_query_struct = Tokens::new(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("}".into_tokens()); |         tokens.append_all(quote! { | ||||||
|         } |             #request_struct_header | ||||||
|  |             #request_struct_body | ||||||
|  |             #request_body_struct | ||||||
|  |             #request_path_struct | ||||||
|  |             #request_query_struct | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -145,65 +145,75 @@ impl From<Vec<Field>> for Response { | |||||||
| 
 | 
 | ||||||
| impl ToTokens for Response { | impl ToTokens for Response { | ||||||
|     fn to_tokens(&self, tokens: &mut Tokens) { |     fn to_tokens(&self, tokens: &mut Tokens) { | ||||||
|         tokens.append_all(quote! { |         let response_struct_header = quote! { | ||||||
|             /// Data in the response from this API endpoint.
 |             /// Data in the response from this API endpoint.
 | ||||||
|             #[derive(Debug)] |             #[derive(Debug)] | ||||||
|             pub struct Response |             pub struct Response | ||||||
|         }); |         }; | ||||||
| 
 | 
 | ||||||
|         if self.fields.len() == 0 { |         let response_struct_body = if self.fields.len() == 0 { | ||||||
|             tokens.append_all(";".into_tokens()); |             quote!(;) | ||||||
|         } else { |         } else { | ||||||
|             tokens.append_all("{".into_tokens()); |             let fields = self.fields.iter().fold(Tokens::new(), |mut fields_tokens, response_field| { | ||||||
| 
 |  | ||||||
|             for response_field in self.fields.iter() { |  | ||||||
|                 let field = response_field.field(); |                 let field = response_field.field(); | ||||||
|                 let span = field.span(); |                 let span = field.span(); | ||||||
| 
 | 
 | ||||||
|                 strip_serde_attrs(field); |                 strip_serde_attrs(field); | ||||||
| 
 | 
 | ||||||
|                 tokens.append_all(quote_spanned!(span=> #field)); |                 fields_tokens.append_all(quote_spanned!(span=> #field,)); | ||||||
| 
 | 
 | ||||||
|                 tokens.append_all(",".into_tokens()); |                 fields_tokens | ||||||
|             } |             }); | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("}".into_tokens()); |             quote! { | ||||||
|  |                 { | ||||||
|  |                     #fields | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let response_body_struct; | ||||||
| 
 | 
 | ||||||
|         if let Some(newtype_body_field) = self.newtype_body_field() { |         if let Some(newtype_body_field) = self.newtype_body_field() { | ||||||
|             let mut field = newtype_body_field.clone(); |             let mut field = newtype_body_field.clone(); | ||||||
|             let ty = &field.ty; |             let ty = &field.ty; | ||||||
|             let span = field.span(); |             let span = field.span(); | ||||||
| 
 | 
 | ||||||
|             tokens.append_all(quote_spanned! {span=> |             response_body_struct = quote_spanned! {span=> | ||||||
|                 /// Data in the response body.
 |                 /// Data in the response body.
 | ||||||
|                 #[derive(Debug, Deserialize)] |                 #[derive(Debug, Deserialize)] | ||||||
|                 struct ResponseBody(#ty); |                 struct ResponseBody(#ty); | ||||||
|             }); |             }; | ||||||
|         } else if self.has_body_fields() { |         } else if self.has_body_fields() { | ||||||
|             tokens.append_all(quote! { |             let fields = self.fields.iter().fold(Tokens::new(), |mut field_tokens, response_field| { | ||||||
|                 /// Data in the response body.
 |  | ||||||
|                 #[derive(Debug, Deserialize)] |  | ||||||
|                 struct ResponseBody |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             tokens.append_all("{".into_tokens()); |  | ||||||
| 
 |  | ||||||
|             for response_field in self.fields.iter() { |  | ||||||
|                 match *response_field { |                 match *response_field { | ||||||
|                     ResponseField::Body(ref field) => { |                     ResponseField::Body(ref field) => { | ||||||
|                         let span = field.span(); |                         let span = field.span(); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(quote_spanned!(span=> #field)); |                         field_tokens.append_all(quote_spanned!(span=> #field,)); | ||||||
| 
 | 
 | ||||||
|                         tokens.append_all(",".into_tokens()); |                         field_tokens | ||||||
|                     } |                     } | ||||||
|                     _ => {} |                     _ => field_tokens, | ||||||
|                 } |                 } | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             response_body_struct = quote! { | ||||||
|  |                 /// Data in the response body.
 | ||||||
|  |                 #[derive(Debug, Deserialize)] | ||||||
|  |                 struct ResponseBody { | ||||||
|  |                     #fields | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |         } else { | ||||||
|  |             response_body_struct = Tokens::new(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|             tokens.append_all("}".into_tokens()); |         tokens.append_all(quote! { | ||||||
|         } |             #response_struct_header | ||||||
|  |             #response_struct_body | ||||||
|  |             #response_body_struct | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user