1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 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
// 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(); }