Extract relevant types out of the metadata's fields.
This commit is contained in:
		
							parent
							
								
									dfaf1c7da1
								
							
						
					
					
						commit
						09e377d68e
					
				| @ -1,14 +1,15 @@ | ||||
| use quote::{ToTokens, Tokens}; | ||||
| use syn::punctuated::Pair; | ||||
| use syn::synom::Synom; | ||||
| use syn::{Expr, ExprStruct, Ident, Member}; | ||||
| use syn::{Expr, ExprStruct, Ident, Lit, Member}; | ||||
| 
 | ||||
| pub struct Metadata { | ||||
|     pub description: Expr, | ||||
|     pub method: Expr, | ||||
|     pub name: Expr, | ||||
|     pub path: Expr, | ||||
|     pub rate_limited: Expr, | ||||
|     pub requires_authentication: Expr, | ||||
|     pub description: String, | ||||
|     pub method: String, | ||||
|     pub name: String, | ||||
|     pub path: String, | ||||
|     pub rate_limited: bool, | ||||
|     pub requires_authentication: bool, | ||||
| } | ||||
| 
 | ||||
| impl From<ExprStruct> for Metadata { | ||||
| @ -24,12 +25,42 @@ impl From<ExprStruct> for Metadata { | ||||
|             let Member::Named(identifier) = field.member; | ||||
| 
 | ||||
|             match identifier.as_ref() { | ||||
|                 "description" => description = Some(field.expr), | ||||
|                 "method" => method = Some(field.expr), | ||||
|                 "name" => name = Some(field.expr), | ||||
|                 "path" => path = Some(field.expr), | ||||
|                 "rate_limited" => rate_limited = Some(field.expr), | ||||
|                 "requires_authentication" => requires_authentication = Some(field.expr), | ||||
|                 "description" => { | ||||
|                     let Expr::Lit(expr_lit) = field.expr; | ||||
|                     let Lit::Str(lit_str) = expr_lit.lit; | ||||
|                     description = Some(lit_str.value()); | ||||
|                 } | ||||
|                 "method" => { | ||||
|                     let Expr::Path(expr_path) = field.expr; | ||||
|                     let path = expr_path.path; | ||||
|                     let segments = path.segments; | ||||
|                     if segments.len() != 1 { | ||||
|                         panic!("ruma_api! expects a one component path for `metadata` `method`"); | ||||
|                     } | ||||
|                     let pair = segments.first().unwrap(); // safe because we just checked
 | ||||
|                     let Pair::End(method_name) = pair; | ||||
|                     method = Some(method_name.ident.to_string()); | ||||
|                 } | ||||
|                 "name" => { | ||||
|                     let Expr::Lit(expr_lit) = field.expr; | ||||
|                     let Lit::Str(lit_str) = expr_lit.lit; | ||||
|                     name = Some(lit_str.value()); | ||||
|                 } | ||||
|                 "path" => { | ||||
|                     let Expr::Lit(expr_lit) = field.expr; | ||||
|                     let Lit::Str(lit_str) = expr_lit.lit; | ||||
|                     path = Some(lit_str.value()); | ||||
|                 } | ||||
|                 "rate_limited" => { | ||||
|                     let Expr::Lit(expr_lit) = field.expr; | ||||
|                     let Lit::Bool(lit_bool) = expr_lit.lit; | ||||
|                     rate_limited = Some(lit_bool.value) | ||||
|                 } | ||||
|                 "requires_authentication" => { | ||||
|                     let Expr::Lit(expr_lit) = field.expr; | ||||
|                     let Lit::Bool(lit_bool) = expr_lit.lit; | ||||
|                     requires_authentication = Some(lit_bool.value) | ||||
|                 } | ||||
|                 _ => panic!("ruma_api! metadata included unexpected field"), | ||||
|             } | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user