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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
#![doc(html_logo_url = "https://avatars0.githubusercontent.com/u/7853871?s=128", html_favicon_url = "https://avatars0.githubusercontent.com/u/7853871?s=256", html_root_url = "http://ironframework.io/core/iron")] #![cfg_attr(test, deny(warnings))] #![deny(missing_docs)] //! The main crate for Iron. //! //! ## Overview //! //! Iron is a high level web framework built in and for Rust, built on //! [hyper](https://github.com/hyperium/hyper). Iron is designed to take advantage //! of Rust's greatest features - it's excellent type system and its principled //! approach to ownership in both single threaded and multi threaded contexts. //! //! Iron is highly concurrent and can scale horizontally on more machines behind a //! load balancer or by running more threads on a more powerful machine. Iron //! avoids the bottlenecks encountered in highly concurrent code by avoiding shared //! writes and locking in the core framework. //! //! ## Hello World //! //! ```no_run //! extern crate iron; //! //! use iron::prelude::*; //! use iron::status; //! //! fn main() { //! Iron::new(|_: &mut Request| { //! Ok(Response::with((status::Ok, "Hello World!"))) //! }).http("localhost:3000").unwrap(); //! } //! ``` //! //! ## Design Philosophy //! //! Iron is meant to be as extensible and pluggable as possible; Iron's core is //! concentrated and avoids unnecessary features by leaving them to middleware, //! plugins, and modifiers. //! //! Middleware, Plugins, and Modifiers are the main ways to extend Iron with new //! functionality. Most extensions that would be provided by middleware in other //! web frameworks are instead addressed by the much simpler Modifier and Plugin //! systems. //! //! Modifiers allow external code to manipulate Requests and Response in an ergonomic //! fashion, allowing third-party extensions to get the same treatment as modifiers //! defined in Iron itself. Plugins allow for lazily-evaluated, automatically cached //! extensions to Requests and Responses, perfect for parsing, accessing, and //! otherwise lazily manipulating an http connection. //! //! Middleware are only used when it is necessary to modify the control flow of a //! Request flow, hijack the entire handling of a Request, check an incoming //! Request, or to do final post-processing. This covers areas such as routing, //! mounting, static asset serving, final template rendering, authentication, and //! logging. //! //! Iron comes with only basic modifiers for setting the status, body, and various //! headers, and the infrastructure for creating modifiers, plugins, and //! middleware. No plugins or middleware are bundled with Iron. //! // Stdlib dependencies #[macro_use] extern crate log; // Third party packages extern crate hyper; extern crate typemap as tmap; extern crate plugin; extern crate error as err; extern crate url; extern crate num_cpus; extern crate conduit_mime_types as mime_types; #[macro_use] extern crate lazy_static; // Request + Response pub use request::{Request, Url}; pub use response::Response; // Middleware system pub use middleware::{BeforeMiddleware, AfterMiddleware, AroundMiddleware, Handler, Chain}; // Server pub use iron::{Iron, Protocol}; // Extensions pub use typemap::TypeMap; // Headers pub use hyper::header as headers; pub use hyper::header::Headers; // Expose `Pluggable` as `Plugin` so users can do `use iron::Plugin`. pub use plugin::Pluggable as Plugin; // Expose modifiers. pub use modifier::Set; // Errors pub use error::Error; pub use error::IronError; // Mime types pub use hyper::mime; /// Iron's error type and associated utilities. pub mod error; /// The Result alias used throughout Iron and in clients of Iron. pub type IronResult<T> = Result<T, IronError>; /// A module meant to be glob imported when using Iron. /// /// For instance: /// /// ``` /// use iron::prelude::*; /// ``` /// /// This module contains several important traits that provide many /// of the convenience methods in Iron, as well as `Request`, `Response` /// `IronResult`, `IronError` and `Iron`. pub mod prelude { pub use {Set, Plugin, Chain, Request, Response, IronResult, IronError, Iron}; } /// Re-exports from the TypeMap crate. pub mod typemap { pub use tmap::{TypeMap, Key}; } /// Re-exports from the Modifier crate. pub mod modifier { extern crate modifier as modfier; pub use self::modfier::*; } /// Status Codes pub mod status { pub use hyper::status::StatusCode as Status; pub use hyper::status::StatusCode::*; pub use hyper::status::StatusClass; } /// HTTP Methods pub mod method { pub use hyper::method::Method; pub use hyper::method::Method::*; } // Publicized to show the documentation pub mod middleware; // Response utilities pub mod response; // Request utilities pub mod request; // Request and Response Modifiers pub mod modifiers; // Helper macros for error handling mod macros; mod iron;