#[macro_use] extern crate log; use fake::{faker::internet::en::Username, Fake}; use gotham::{ middleware::logger::RequestLogger, pipeline::{new_pipeline, single::single_pipeline}, router::builder::*, state::State }; use gotham_restful::*; use log::LevelFilter; use log4rs::{ append::console::ConsoleAppender, config::{Appender, Config, Root}, encode::pattern::PatternEncoder }; rest_resource!{Users, route => { route.read_all::(); route.read::(); route.create::(); route.update_all::(); route.update::(); }} rest_struct!{User { username : String }} impl ResourceReadAll>> for Users { fn read_all(_state : &mut State) -> Success> { vec![Username().fake(), Username().fake()] .into_iter() .map(|username| User { username }) .collect::>() .into() } } impl ResourceRead> for Users { fn read(_state : &mut State, id : u64) -> Success { let username : String = Username().fake(); User { username: format!("{}{}", username, id) }.into() } } impl ResourceCreate> for Users { fn create(_state : &mut State, body : User) -> Success<()> { info!("Created User: {}", body.username); ().into() } } impl ResourceUpdateAll, Success<()>> for Users { fn update_all(_state : &mut State, body : Vec) -> Success<()> { info!("Changing all Users to {:?}", body.into_iter().map(|u| u.username).collect::>()); ().into() } } impl ResourceUpdate> for Users { fn update(_state : &mut State, id : u64, body : User) -> Success<()> { info!("Change User {} to {}", id, body.username); ().into() } } impl ResourceDeleteAll> for Users { fn delete_all(_state : &mut State) -> Success<()> { info!("Delete all Users"); ().into() } } impl ResourceDelete> for Users { fn delete(_state : &mut State, id : u64) -> Success<()> { info!("Delete User {}", id); ().into() } } const ADDR : &str = "127.0.0.1:18080"; fn main() { let encoder = PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S%.3f %Z)} [{l}] {M} - {m}\n"); let config = Config::builder() .appender( Appender::builder() .build("stdout", Box::new( ConsoleAppender::builder() .encoder(Box::new(encoder)) .build() ))) .build(Root::builder().appender("stdout").build(LevelFilter::Info)) .unwrap(); log4rs::init_config(config).unwrap(); let logging = RequestLogger::new(log::Level::Info); let (chain, pipelines) = single_pipeline( new_pipeline() .add(logging) .build() ); gotham::start(ADDR, build_router(chain, pipelines, |route| { route.resource::("users"); })); println!("Gotham started on {} for testing", ADDR); }