pub struct Namespace {
pub handlers: ApiHandlers,
pub path: Path,
pub coercer: Option<Builder>,
/* private fields */
}
Fields§
§handlers: ApiHandlers
§path: Path
§coercer: Option<Builder>
Implementations§
Source§impl Namespace
impl Namespace
pub fn new(path: &str) -> Namespace
Sourcepub fn params<F>(&mut self, builder: F)
pub fn params<F>(&mut self, builder: F)
Examples found in repository?
examples/simple.rs (lines 82-84)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
fn main() {
let mut app = rustless::Application::new(rustless::Api::build(|api| {
api.prefix("api");
api.version("v1", rustless::Versioning::Path);
api.mount(swagger::create_api("api-docs"));
api.error_formatter(|err, _media| {
match err.downcast::<UnauthorizedError>() {
Some(_) => {
return Some(rustless::Response::from(
status::StatusCode::Unauthorized,
Box::new("Please provide correct `token` parameter")
))
},
None => None
}
});
api.post("greet/:name", |endpoint| {
endpoint.summary("Sends greeting");
endpoint.desc("Use this to talk to yourself");
endpoint.params(|params| {
params.req_typed("name", json_dsl::string());
params.req_typed("greeting", json_dsl::string());
});
endpoint.handle(|client, params| {
client.text(
format!("{}, {}",
params.find("greeting").unwrap().to_string(),
params.find("name").unwrap().to_string())
)
})
});
api.get("echo", |endpoint| {
endpoint.summary("Sends back what it gets");
endpoint.desc("Use this to talk to yourself");
endpoint.handle(|client, params| {
client.json(params)
})
});
api.namespace("admin", |admin_ns| {
admin_ns.params(|params| {
params.req_typed("token", json_dsl::string())
});
// Using after_validation callback to check token
admin_ns.after_validation(|_client, params| {
match params.find("token") {
// We can unwrap() safely because token in validated already
Some(token) => if token.as_str().unwrap() == "password1" { return Ok(()) },
None => ()
}
// Fire error from callback is token is wrong
return Err(rustless::ErrorResponse{
error: Box::new(UnauthorizedError) as Box<Error + Send>,
response: None
})
});
// This `/api/admin/server_status` endpoint is secure now
admin_ns.get("server_status", |endpoint| {
endpoint.summary("Get server status");
endpoint.desc("Use this API to receive some useful information about the state of our server");
endpoint.handle(|client, _params| {
{
let cookies = client.request.cookies();
#[cfg(feature = "ssl")]
let signed_cookies = cookies.signed();
#[cfg(not(feature = "ssl"))]
let signed_cookies = cookies;
let user_cookie = Cookie::new("session".to_string(), "verified".to_string());
signed_cookies.add(user_cookie);
}
client.text("Everything is OK".to_string())
})
});
})
}));
swagger::enable(&mut app, swagger::Spec {
info: swagger::Info {
title: "Example API".to_string(),
description: Some("Simple API to demonstration".to_string()),
contact: Some(swagger::Contact {
name: "Stanislav Panferov".to_string(),
url: Some("http://panferov.me".to_string()),
..std::default::Default::default()
}),
license: Some(swagger::License {
name: "MIT".to_string(),
url: "http://opensource.org/licenses/MIT".to_string()
}),
..std::default::Default::default()
},
..std::default::Default::default()
});
let mut chain = iron::Chain::new(app);
chain.link(::rustless::batteries::cookie::new("secretsecretsecretsecretsecretsecretsecret".as_bytes()));
iron::Iron::new(chain).http("0.0.0.0:4000").unwrap();
println!("On 4000");
}
pub fn build<F>(path: &str, builder: F) -> Namespace
Trait Implementations§
Source§impl ApiHandler for Namespace
impl ApiHandler for Namespace
Source§impl Nesting for Namespace
impl Nesting for Namespace
fn mount<H>(&mut self, edp: H)
fn namespace<F>(&mut self, path: &str, builder: F)
fn group<F>(&mut self, path: &str, builder: F)
fn resource<F>(&mut self, path: &str, builder: F)
fn resources<F>(&mut self, path: &str, builder: F)
fn segment<F>(&mut self, path: &str, builder: F)
fn get<F>(&mut self, path: &str, builder: F)
fn post<F>(&mut self, path: &str, builder: F)
fn put<F>(&mut self, path: &str, builder: F)
fn delete<F>(&mut self, path: &str, builder: F)
fn options<F>(&mut self, path: &str, builder: F)
fn head<F>(&mut self, path: &str, builder: F)
fn before<F>(&mut self, callback: F)
fn before_validation<F>(&mut self, callback: F)
fn after<F>(&mut self, callback: F)
fn after_validation<F>(&mut self, callback: F)
fn call_handlers<'a, 'r>( &'a self, rest_path: &str, params: &mut JsonValue, req: &'r mut (dyn Request + 'r), info: &mut CallInfo<'a>, ) -> HandleResult<Response>
Source§impl Node for Namespace
impl Node for Namespace
fn get_handlers<'a>(&'a self) -> &'a ApiHandlers
fn get_handlers_mut<'a>(&'a mut self) -> &'a mut ApiHandlers
fn get_before<'a>(&'a self) -> &'a Callbacks
fn get_before_mut<'a>(&'a mut self) -> &'a mut Callbacks
fn get_before_validation<'a>(&'a self) -> &'a Callbacks
fn get_before_validation_mut<'a>(&'a mut self) -> &'a mut Callbacks
fn get_after_validation<'a>(&'a self) -> &'a Callbacks
fn get_after_validation_mut<'a>(&'a mut self) -> &'a mut Callbacks
fn get_after<'a>(&'a self) -> &'a Callbacks
fn get_after_mut<'a>(&'a mut self) -> &'a mut Callbacks
fn push_node<'a>(&'a self, _info: &mut CallInfo<'a>)
Auto Trait Implementations§
impl !Freeze for Namespace
impl !RefUnwindSafe for Namespace
impl Send for Namespace
impl Sync for Namespace
impl Unpin for Namespace
impl !UnwindSafe for Namespace
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> PersistentInto<Arc<Mutex<T>>> for T
impl<T> PersistentInto<Arc<Mutex<T>>> for T
Source§fn persistent_into(self) -> Arc<Mutex<T>>
fn persistent_into(self) -> Arc<Mutex<T>>
Convert
self
into a value of type T
.Source§impl<T> PersistentInto<Arc<RwLock<T>>> for T
impl<T> PersistentInto<Arc<RwLock<T>>> for T
Source§fn persistent_into(self) -> Arc<RwLock<T>>
fn persistent_into(self) -> Arc<RwLock<T>>
Convert
self
into a value of type T
.Source§impl<T> PersistentInto<Arc<T>> for T
impl<T> PersistentInto<Arc<T>> for T
Source§fn persistent_into(self) -> Arc<T>
fn persistent_into(self) -> Arc<T>
Convert
self
into a value of type T
.Source§impl<T> PersistentInto<T> for T
impl<T> PersistentInto<T> for T
Source§fn persistent_into(self) -> T
fn persistent_into(self) -> T
Convert
self
into a value of type T
.