Allow a single field to be specified as the entire request body.
This commit is contained in:
		
							parent
							
								
									fc46b9a58b
								
							
						
					
					
						commit
						90c3654254
					
				| @ -33,10 +33,29 @@ impl Request { | |||||||
|     fn body_fields(&self) -> RequestBodyFields { |     fn body_fields(&self) -> RequestBodyFields { | ||||||
|         RequestBodyFields::new(&self.fields) |         RequestBodyFields::new(&self.fields) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn newtype_body_field(&self) -> Option<Field> { | ||||||
|  |         for request_field in self.fields.iter() { | ||||||
|  |             match *request_field { | ||||||
|  |                 RequestField::NewtypeBody(ref field) => { | ||||||
|  |                     let mut newtype_field = field.clone(); | ||||||
|  | 
 | ||||||
|  |                     newtype_field.ident = None; | ||||||
|  | 
 | ||||||
|  |                     return Some(newtype_field); | ||||||
|  |                 } | ||||||
|  |                 _ => continue, | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         None | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl From<Vec<Field>> for Request { | impl From<Vec<Field>> for Request { | ||||||
|     fn from(fields: Vec<Field>) -> Self { |     fn from(fields: Vec<Field>) -> Self { | ||||||
|  |         let mut has_newtype_body = false; | ||||||
|  | 
 | ||||||
|         let request_fields = fields.into_iter().map(|mut field| { |         let request_fields = fields.into_iter().map(|mut field| { | ||||||
|             let mut request_field_kind = RequestFieldKind::Body; |             let mut request_field_kind = RequestFieldKind::Body; | ||||||
| 
 | 
 | ||||||
| @ -55,7 +74,10 @@ impl From<Vec<Field>> for Request { | |||||||
|                         NestedMetaItem::MetaItem(ref meta_item) => { |                         NestedMetaItem::MetaItem(ref meta_item) => { | ||||||
|                             match *meta_item { |                             match *meta_item { | ||||||
|                                 MetaItem::Word(ref ident) => { |                                 MetaItem::Word(ref ident) => { | ||||||
|                                     if ident == "header" { |                                     if ident == "body" { | ||||||
|  |                                         has_newtype_body = true; | ||||||
|  |                                         request_field_kind = RequestFieldKind::NewtypeBody; | ||||||
|  |                                     } else if ident == "header" { | ||||||
|                                         request_field_kind = RequestFieldKind::Header; |                                         request_field_kind = RequestFieldKind::Header; | ||||||
|                                     } else if ident == "path" { |                                     } else if ident == "path" { | ||||||
|                                         request_field_kind = RequestFieldKind::Path; |                                         request_field_kind = RequestFieldKind::Path; | ||||||
| @ -63,7 +85,7 @@ impl From<Vec<Field>> for Request { | |||||||
|                                         request_field_kind = RequestFieldKind::Query; |                                         request_field_kind = RequestFieldKind::Query; | ||||||
|                                     } else { |                                     } else { | ||||||
|                                         panic!( |                                         panic!( | ||||||
|                                             "ruma_api! attribute meta item on requests must be: header, path, or query" |                                             "ruma_api! attribute meta item on requests must be: body, header, path, or query" | ||||||
|                                         ); |                                         ); | ||||||
|                                     } |                                     } | ||||||
|                                 } |                                 } | ||||||
| @ -73,7 +95,7 @@ impl From<Vec<Field>> for Request { | |||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                         NestedMetaItem::Literal(_) => panic!( |                         NestedMetaItem::Literal(_) => panic!( | ||||||
|                             "ruma_api! attribute meta item on requests must be: header, path, or query" |                             "ruma_api! attribute meta item on requests must be: body, header, path, or query" | ||||||
|                         ), |                         ), | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @ -82,8 +104,15 @@ impl From<Vec<Field>> for Request { | |||||||
|             }).collect(); |             }).collect(); | ||||||
| 
 | 
 | ||||||
|             match request_field_kind { |             match request_field_kind { | ||||||
|                 RequestFieldKind::Body => RequestField::Body(field), |                 RequestFieldKind::Body => { | ||||||
|  |                     if has_newtype_body { | ||||||
|  |                         panic!("ruma_api! requests cannot have both normal body fields and a newtype body field"); | ||||||
|  |                     } else { | ||||||
|  |                         return RequestField::Body(field); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|                 RequestFieldKind::Header => RequestField::Header(field), |                 RequestFieldKind::Header => RequestField::Header(field), | ||||||
|  |                 RequestFieldKind::NewtypeBody => RequestField::NewtypeBody(field), | ||||||
|                 RequestFieldKind::Path => RequestField::Path(field), |                 RequestFieldKind::Path => RequestField::Path(field), | ||||||
|                 RequestFieldKind::Query => RequestField::Query(field), |                 RequestFieldKind::Query => RequestField::Query(field), | ||||||
|             } |             } | ||||||
| @ -112,6 +141,7 @@ impl ToTokens for Request { | |||||||
|                 match *request_field { |                 match *request_field { | ||||||
|                     RequestField::Body(ref field) => field.to_tokens(&mut tokens), |                     RequestField::Body(ref field) => field.to_tokens(&mut tokens), | ||||||
|                     RequestField::Header(ref field) => field.to_tokens(&mut tokens), |                     RequestField::Header(ref field) => field.to_tokens(&mut tokens), | ||||||
|  |                     RequestField::NewtypeBody(ref field) => field.to_tokens(&mut tokens), | ||||||
|                     RequestField::Path(ref field) => field.to_tokens(&mut tokens), |                     RequestField::Path(ref field) => field.to_tokens(&mut tokens), | ||||||
|                     RequestField::Query(ref field) => field.to_tokens(&mut tokens), |                     RequestField::Query(ref field) => field.to_tokens(&mut tokens), | ||||||
|                 } |                 } | ||||||
| @ -122,7 +152,19 @@ impl ToTokens for Request { | |||||||
|             tokens.append("}"); |             tokens.append("}"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if self.has_body_fields() { |         if let Some(newtype_body_field) = self.newtype_body_field() { | ||||||
|  |             tokens.append(quote! { | ||||||
|  |                 /// Data in the request body.
 | ||||||
|  |                 #[derive(Debug, Serialize)] | ||||||
|  |                 struct RequestBody | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             tokens.append("("); | ||||||
|  | 
 | ||||||
|  |             newtype_body_field.to_tokens(&mut tokens); | ||||||
|  | 
 | ||||||
|  |             tokens.append(");"); | ||||||
|  |         } else if self.has_body_fields() { | ||||||
|             tokens.append(quote! { |             tokens.append(quote! { | ||||||
|                 /// Data in the request body.
 |                 /// Data in the request body.
 | ||||||
|                 #[derive(Debug, Serialize)] |                 #[derive(Debug, Serialize)] | ||||||
| @ -151,6 +193,7 @@ impl ToTokens for Request { | |||||||
| pub enum RequestField { | pub enum RequestField { | ||||||
|     Body(Field), |     Body(Field), | ||||||
|     Header(Field), |     Header(Field), | ||||||
|  |     NewtypeBody(Field), | ||||||
|     Path(Field), |     Path(Field), | ||||||
|     Query(Field), |     Query(Field), | ||||||
| } | } | ||||||
| @ -167,6 +210,7 @@ impl RequestField { | |||||||
| enum RequestFieldKind { | enum RequestFieldKind { | ||||||
|     Body, |     Body, | ||||||
|     Header, |     Header, | ||||||
|  |     NewtypeBody, | ||||||
|     Path, |     Path, | ||||||
|     Query, |     Query, | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user