From c3e2185396a3ee75a9e14cf3c38138d09c3bba50 Mon Sep 17 00:00:00 2001 From: Dominic Date: Wed, 15 Apr 2020 21:41:24 +0200 Subject: [PATCH 1/2] remove some more expect/panic stuff --- gotham_restful_derive/src/method.rs | 2 +- gotham_restful_derive/src/resource.rs | 50 +++++++++++++++++---------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/gotham_restful_derive/src/method.rs b/gotham_restful_derive/src/method.rs index 7e50f13..852755b 100644 --- a/gotham_restful_derive/src/method.rs +++ b/gotham_restful_derive/src/method.rs @@ -47,7 +47,7 @@ impl FromStr for Method "Update" | "update" => Ok(Self::Update), "DeleteAll" | "delete_all" => Ok(Self::DeleteAll), "Delete" | "delete" => Ok(Self::Delete), - _ => Err("unknown method".to_string()) + _ => Err(format!("Unknown method: `{}'", str)) } } } diff --git a/gotham_restful_derive/src/resource.rs b/gotham_restful_derive/src/resource.rs index e7d0537..fe2f47d 100644 --- a/gotham_restful_derive/src/resource.rs +++ b/gotham_restful_derive/src/resource.rs @@ -1,23 +1,27 @@ -use crate::method::Method; +use crate::{ + method::Method, + util::CollectToResult +}; use proc_macro::TokenStream; use proc_macro2::TokenStream as TokenStream2; use quote::quote; use syn::{ - parse::{Parse, ParseStream, Result as SynResult}, + parse::{Parse, ParseStream}, punctuated::Punctuated, token::Comma, + Error, Ident, ItemStruct, parenthesized, parse_macro_input }; -use std::str::FromStr; +use std::{iter, str::FromStr}; struct MethodList(Punctuated); impl Parse for MethodList { - fn parse(input: ParseStream) -> SynResult + fn parse(input: ParseStream) -> Result { let content; let _paren = parenthesized!(content in input); @@ -26,26 +30,28 @@ impl Parse for MethodList } } -pub fn expand_resource(tokens : TokenStream) -> TokenStream +fn expand(tokens : TokenStream) -> Result { let krate = super::krate(); - let input = parse_macro_input!(tokens as ItemStruct); + let input = parse_macro_input::parse::(tokens)?; let ident = input.ident; let name = ident.to_string(); - let methods : Vec = input.attrs.into_iter().filter(|attr| + let methods = input.attrs.into_iter().filter(|attr| attr.path.segments.iter().last().map(|segment| segment.ident.to_string()) == Some("rest_resource".to_string()) // TODO wtf - ).flat_map(|attr| { - let m : MethodList = syn::parse2(attr.tokens).expect("unable to parse attributes"); - m.0.into_iter() - }).map(|method| { - let method = Method::from_str(&method.to_string()).expect("unknown method"); - let mod_ident = method.mod_ident(&name); - let ident = method.setup_ident(&name); - quote!(#mod_ident::#ident(&mut route);) - }).collect(); + ).map(|attr| { + syn::parse2(attr.tokens).map(|m : MethodList| m.0.into_iter()) + }).flat_map(|list| match list { + Ok(iter) => Box::new(iter.map(|method| { + let method = Method::from_str(&method.to_string()).map_err(|err| Error::new(method.span(), err))?; + let mod_ident = method.mod_ident(&name); + let ident = method.setup_ident(&name); + Ok(quote!(#mod_ident::#ident(&mut route);)) + })) as Box>>, + Err(err) => Box::new(iter::once(Err(err))) + }).collect_to_result()?; - let output = quote! { + Ok(quote! { impl #krate::Resource for #ident { fn name() -> String @@ -58,6 +64,12 @@ pub fn expand_resource(tokens : TokenStream) -> TokenStream #(#methods)* } } - }; - output.into() + }) +} + +pub fn expand_resource(tokens : TokenStream) -> TokenStream +{ + expand(tokens) + .unwrap_or_else(|err| err.to_compile_error()) + .into() } From 659fd2f7e2d93d75dee7e392b67fc4303c82f8c7 Mon Sep 17 00:00:00 2001 From: Dominic Date: Wed, 15 Apr 2020 21:50:38 +0200 Subject: [PATCH 2/2] bump version to 0.0.4 / derive 0.0.3 --- example/Cargo.toml | 2 +- gotham_restful/Cargo.toml | 4 ++-- gotham_restful_derive/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/Cargo.toml b/example/Cargo.toml index a1ff5df..b7f0eba 100644 --- a/example/Cargo.toml +++ b/example/Cargo.toml @@ -17,7 +17,7 @@ gitlab = { repository = "msrd0/gotham-restful", branch = "master" } fake = "2.2" gotham = "0.4" gotham_derive = "0.4" -gotham_restful = { version = "0.0.3", features = ["auth", "openapi"] } +gotham_restful = { version = "0.0.4", features = ["auth", "openapi"] } hyper = "0.12" log = "0.4" log4rs = { version = "0.8", features = ["console_appender"], default-features = false } diff --git a/gotham_restful/Cargo.toml b/gotham_restful/Cargo.toml index 4aad918..5f7b2f7 100644 --- a/gotham_restful/Cargo.toml +++ b/gotham_restful/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "gotham_restful" -version = "0.0.3" +version = "0.0.4" authors = ["Dominic Meiser "] edition = "2018" description = "RESTful additions for Gotham" @@ -22,7 +22,7 @@ futures = "0.1.29" gotham = "0.4" gotham_derive = "0.4" gotham_middleware_diesel = { version = "0.1", optional = true } -gotham_restful_derive = { version = "0.0.2" } +gotham_restful_derive = { version = "0.0.3" } hyper = "0.12.35" indexmap = { version = "1.3.0", optional = true } jsonwebtoken = { version = "6.0.1", optional = true } diff --git a/gotham_restful_derive/Cargo.toml b/gotham_restful_derive/Cargo.toml index b2b7ec6..c1f460e 100644 --- a/gotham_restful_derive/Cargo.toml +++ b/gotham_restful_derive/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "gotham_restful_derive" -version = "0.0.2" +version = "0.0.3" authors = ["Dominic Meiser "] edition = "2018" description = "RESTful additions for Gotham - Derive"