Crates.io | rocket_failure |
lib.rs | rocket_failure |
version | 0.2.0 |
source | src |
created_at | 2018-12-09 22:46:06.726726 |
updated_at | 2019-07-22 03:19:06.229186 |
description | Failure like error handling for rocket |
homepage | |
repository | https://github.com/kpcyrd/rocket_failure |
max_upload_size | |
id | 101018 |
size | 53,831 |
Semantic error handling for rocket applications.
To enable this crate in your server add this line to your Cargo.toml
:
rocket_failure = { version="0.1", features = ["with-rocket"] }
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
#[macro_use] extern crate rocket_failure;
use rocket_failure::errors::*;
use std::fs;
#[get("/<file>")]
fn index(file: String) -> ApiResult<Vec<u8>> {
if !file.chars().all(|c| char::is_alphanumeric(c) || c == '-' || c == '.') {
bad_request!("file contains forbidden characters")
}
// if this returns an Err(_), return a standard 404
let content = fs::read(&file)
.not_found()?;
// detailed errors are hidden by default
// we can publish the actual error if we want to
/*
let content = fs::read(&file)
.not_found()
.publish_error()?;
*/
// or we can set a public error while preserving the actual error
/*
let content = fs::read(&file)
.not_found()
.public_context("That didn't work")?;
*/
Ok(content)
}
fn main() {
rocket::ignite().mount("/", routes![index]).launch();
}
You can run this example with:
cargo +nightly run --example fileserver --features=with-rocket
With you want to use the ApiResult<T>
type in your api client to consume the
api, omit the with-rocket
feature:
rocket_failure = "0.1"
rocket_failure is licensed under either of the following, at your option: