| // Copyright 2016 `multipart` Crate Developers | |
| // | |
| // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or | |
| // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or | |
| // http://opensource.org/licenses/MIT>, at your option. This file may not be | |
| // copied, modified, or distributed except according to those terms. | |
| //! Client- and server-side abstractions for HTTP `multipart/form-data` requests. | |
| //! | |
| //! ### Features: | |
| //! This documentation is built with all features enabled. | |
| //! | |
| //! * `client`: The client-side abstractions for generating multipart requests. | |
| //! | |
| //! * `server`: The server-side abstractions for parsing multipart requests. | |
| //! | |
| //! * `mock`: Provides mock implementations of core `client` and `server` traits for debugging | |
| //! or non-standard use. | |
| //! | |
| //! * `hyper`: Integration with the [Hyper](https://crates.io/crates/hyper) HTTP library | |
| //! for client and/or server depending on which other feature flags are set. | |
| //! | |
| //! * `iron`: Integration with the [Iron](http://crates.io/crates/iron) web application | |
| //! framework. See the [`server::iron`](server/iron/index.html) module for more information. | |
| //! | |
| //! * `nickel` (returning in 0.14!): Integration with the [Nickel](https://crates.io/crates/nickel) | |
| //! web application framework. See the [`server::nickel`](server/nickel/index.html) module for more | |
| //! information. | |
| //! | |
| //! * `tiny_http`: Integration with the [`tiny_http`](https://crates.io/crates/tiny_http) | |
| //! crate. See the [`server::tiny_http`](server/tiny_http/index.html) module for more information. | |
| //! | |
| //! ### Note: Work in Progress | |
| //! I have left a number of Request-for-Comments (RFC) questions on various APIs and other places | |
| //! in the code as there are some cases where I'm not sure what the desirable behavior is. | |
| //! | |
| //! I have opened an issue as a place to collect responses and discussions for these questions | |
| //! [on Github](https://github.com/abonander/multipart/issues/96). Please quote the RFC-statement | |
| //! (and/or link to its source line) and provide your feedback there. | |
| #![cfg_attr(feature="clippy", feature(plugin))] | |
| #![cfg_attr(feature="clippy", plugin(clippy))] | |
| #![cfg_attr(feature="clippy", deny(clippy))] | |
| #![cfg_attr(feature = "bench", feature(test))] | |
| #![deny(missing_docs)] | |
| #[macro_use] | |
| extern crate log; | |
| #[macro_use] | |
| extern crate mime; | |
| extern crate mime_guess; | |
| extern crate rand; | |
| extern crate tempdir; | |
| #[cfg(feature = "quick-error")] | |
| #[macro_use] | |
| extern crate quick_error; | |
| #[cfg(feature = "server")] | |
| extern crate safemem; | |
| #[cfg(feature = "hyper")] | |
| extern crate hyper; | |
| #[cfg(feature = "iron")] | |
| extern crate iron; | |
| #[cfg(feature = "tiny_http")] | |
| extern crate tiny_http; | |
| #[cfg(test)] | |
| extern crate env_logger; | |
| #[cfg(any(feature = "mock", test))] | |
| pub mod mock; | |
| use rand::Rng; | |
| /// Chain a series of results together, with or without previous results. | |
| /// | |
| /// ``` | |
| /// #[macro_use] extern crate multipart; | |
| /// | |
| /// fn try_add_one(val: u32) -> Result<u32, u32> { | |
| /// if val < 5 { | |
| /// Ok(val + 1) | |
| /// } else { | |
| /// Err(val) | |
| /// } | |
| /// } | |
| /// | |
| /// fn main() { | |
| /// let res = chain_result! { | |
| /// try_add_one(1), | |
| /// prev -> try_add_one(prev), | |
| /// prev -> try_add_one(prev), | |
| /// prev -> try_add_one(prev) | |
| /// }; | |
| /// | |
| /// println!("{:?}", res); | |
| /// } | |
| /// | |
| /// ``` | |
| #[macro_export] | |
| macro_rules! chain_result { | |
| ($first_expr:expr, $($try_expr:expr),*) => ( | |
| $first_expr $(.and_then(|_| $try_expr))* | |
| ); | |
| ($first_expr:expr, $($($arg:ident),+ -> $try_expr:expr),*) => ( | |
| $first_expr $(.and_then(|$($arg),+| $try_expr))* | |
| ); | |
| } | |
| #[cfg(feature = "client")] | |
| pub mod client; | |
| #[cfg(feature = "server")] | |
| pub mod server; | |
| #[cfg(all(test, feature = "client", feature = "server"))] | |
| mod local_test; | |
| fn random_alphanumeric(len: usize) -> String { | |
| rand::thread_rng().gen_ascii_chars().take(len).collect() | |
| } | |
| #[cfg(test)] | |
| fn init_log() { | |
| let _ = env_logger::try_init(); | |
| } |