2019-09-27 17:43:01 +02:00
|
|
|
#[macro_use] extern crate log;
|
2019-09-27 16:36:38 +02:00
|
|
|
#[macro_use] extern crate serde;
|
2019-09-27 15:45:54 +02:00
|
|
|
|
|
|
|
use fake::{faker::internet::en::Username, Fake};
|
|
|
|
use gotham::{
|
|
|
|
middleware::logger::RequestLogger,
|
|
|
|
pipeline::{new_pipeline, single::single_pipeline},
|
|
|
|
router::builder::*,
|
|
|
|
state::State
|
|
|
|
};
|
2019-09-27 17:43:01 +02:00
|
|
|
use gotham_restful::*;
|
2019-09-27 15:56:08 +02:00
|
|
|
use log::LevelFilter;
|
|
|
|
use log4rs::{
|
|
|
|
append::console::ConsoleAppender,
|
|
|
|
config::{Appender, Config, Root},
|
|
|
|
encode::pattern::PatternEncoder
|
|
|
|
};
|
2019-09-27 15:45:54 +02:00
|
|
|
|
|
|
|
struct Users;
|
|
|
|
|
2019-09-27 17:43:01 +02:00
|
|
|
#[derive(Deserialize, Serialize)]
|
2019-09-27 15:45:54 +02:00
|
|
|
struct User
|
|
|
|
{
|
|
|
|
username : String
|
|
|
|
}
|
|
|
|
|
|
|
|
impl IndexResource<Success<Vec<User>>> for Users
|
|
|
|
{
|
|
|
|
fn index(_state : &mut State) -> Success<Vec<User>>
|
|
|
|
{
|
|
|
|
vec![Username().fake(), Username().fake()]
|
|
|
|
.into_iter()
|
|
|
|
.map(|username| User { username })
|
|
|
|
.collect::<Vec<User>>()
|
|
|
|
.into()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-27 16:36:38 +02:00
|
|
|
impl GetResource<u64, Success<User>> for Users
|
|
|
|
{
|
|
|
|
fn get(_state : &mut State, id : u64) -> Success<User>
|
|
|
|
{
|
|
|
|
let username : String = Username().fake();
|
|
|
|
User { username: format!("{}{}", username, id) }.into()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-27 17:43:01 +02:00
|
|
|
impl CreateResource<User, Success<()>> for Users
|
|
|
|
{
|
|
|
|
fn create(_state : &mut State, body : User) -> Success<()>
|
|
|
|
{
|
|
|
|
info!("Created User: {}", body.username);
|
|
|
|
().into()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-27 15:45:54 +02:00
|
|
|
impl Resource for Users
|
|
|
|
{
|
|
|
|
fn setup<D : DrawResourceRoutes>(mut route : D)
|
|
|
|
{
|
|
|
|
route.index::<_, Self>();
|
2019-09-27 16:36:38 +02:00
|
|
|
route.get::<_, _, Self>();
|
2019-09-27 17:43:01 +02:00
|
|
|
route.create::<_, _, Self>();
|
2019-09-27 15:45:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const ADDR : &str = "127.0.0.1:18080";
|
|
|
|
|
|
|
|
fn main()
|
|
|
|
{
|
2019-09-27 15:56:08 +02:00
|
|
|
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();
|
|
|
|
|
2019-09-27 15:45:54 +02:00
|
|
|
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, _>("users");
|
|
|
|
}));
|
|
|
|
println!("Gotham started on {} for testing", ADDR);
|
|
|
|
}
|
|
|
|
|