diff --git a/examples/users.rs b/examples/users.rs index 077ef41..6ba9b55 100644 --- a/examples/users.rs +++ b/examples/users.rs @@ -1,5 +1,4 @@ #[macro_use] extern crate log; -#[macro_use] extern crate serde; use fake::{faker::internet::en::Username, Fake}; use gotham::{ @@ -16,13 +15,17 @@ use log4rs::{ encode::pattern::PatternEncoder }; -struct Users; +rest_resource!{Users, route => { + route.read_all::(); + route.read::(); + route.create::(); + route.update_all::(); + route.update::(); +}} -#[derive(Deserialize, Serialize)] -struct User -{ +rest_struct!{User { username : String -} +}} impl ResourceReadAll>> for Users { @@ -90,18 +93,6 @@ impl ResourceDelete> for Users } } -impl Resource for Users -{ - fn setup(mut route : D) - { - route.read_all::(); - route.read::(); - route.create::(); - route.update_all::(); - route.update::(); - } -} - const ADDR : &str = "127.0.0.1:18080"; fn main() diff --git a/src/helper.rs b/src/helper.rs new file mode 100644 index 0000000..44d606b --- /dev/null +++ b/src/helper.rs @@ -0,0 +1,28 @@ + +#[macro_export] +macro_rules! rest_struct { + ($struct_name:ident { $($field_id:ident : $field_ty:ty),* }) => { + #[derive(serde::Deserialize, serde::Serialize)] + struct $struct_name + { + $($field_id : $field_ty),* + } + } +} + +#[macro_export] +macro_rules! rest_resource { + ($res_name:ident, $route:ident => $setup:block) => { + struct $res_name; + + impl ::gotham_restful::Resource for $res_name + { + fn name() -> String + { + stringify!($res_name).to_string() + } + + fn setup(mut $route : D) $setup + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 8bbdab3..2a12070 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,8 @@ pub use hyper::StatusCode; +pub mod helper; + #[cfg(feature = "openapi")] pub mod openapi; #[cfg(feature = "openapi")] diff --git a/src/resource.rs b/src/resource.rs index 5bc603b..f82947c 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -7,6 +7,11 @@ use std::panic::RefUnwindSafe; /// allow you to register the different methods for this Resource. pub trait Resource { + /// The name of this resource. Must be unique. + fn name() -> String; + + /// Setup all routes of this resource. Take a look at the rest_resource! + /// macro if you don't feel like caring yourself. fn setup(route : D); }