diff --git a/.gitignore b/.gitignore
index 2c1955fc2..42d0755dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
-target/
Cargo.lock
+target/
+guide/build/
/gh-pages
-__pycache__
*.so
*.out
@@ -9,7 +9,6 @@ __pycache__
*.pid
*.sock
*~
-*.egg-info/
# These are backup files generated by rustfmt
**/*.rs.bk
diff --git a/.travis.yml b/.travis.yml
index 121ba990e..922665bbe 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,6 +29,13 @@ before_script:
script:
- USE_SKEPTIC=1 cargo test --features=alpn
+
+ # Build without unstable flag
+ - cargo build
+
+ # Test examples in guide.
+ - rustdoc --test guide/src/qs_2.md -L target/debug -L target/debug/deps
+
- |
if [[ "$TRAVIS_RUST_VERSION" == "nightly" && $CLIPPY ]]; then
cargo clippy
@@ -40,6 +47,8 @@ after_success:
if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_PULL_REQUEST" = "false" && "$TRAVIS_BRANCH" == "master" && "$TRAVIS_RUST_VERSION" == "nightly" ]]; then
cargo doc --features alpn --no-deps &&
echo "" > target/doc/index.html &&
+ cargo install mdbook &&
+ cd guide && mdbook build -d ../target/doc/guide && cd .. &&
git clone https://github.com/davisp/ghp-import.git &&
./ghp-import/ghp_import.py -n -p -f -m "Documentation upload" -r https://"$GH_TOKEN"@github.com/"$TRAVIS_REPO_SLUG.git" target/doc &&
echo "Uploaded documentation"
diff --git a/build.rs b/build.rs
index 3afd10295..1da14f1e0 100644
--- a/build.rs
+++ b/build.rs
@@ -8,7 +8,7 @@ use std::{env, fs};
fn main() {
if env::var("USE_SKEPTIC").is_ok() {
// generates doc tests for `README.md`.
- skeptic::generate_doc_tests(&["README.md"]);
+ skeptic::generate_doc_tests(&["README.md", "guide/src/qs_2.md"]);
} else {
let f = env::var("OUT_DIR").unwrap() + "/skeptic-tests.rs";
let _ = fs::File::create(f);
diff --git a/examples/basic.rs b/examples/basic.rs
index 011a6a8d4..ff8cf744e 100644
--- a/examples/basic.rs
+++ b/examples/basic.rs
@@ -11,7 +11,7 @@ use actix_web::error::{Error, Result};
use actix_web::middlewares::RequestSession;
use futures::stream::{once, Once};
-/// somple handle
+/// simple handler
fn index(mut req: HttpRequest) -> Result {
println!("{:?}", req);
if let Ok(ch) = req.payload_mut().readany() {
@@ -31,7 +31,7 @@ fn index(mut req: HttpRequest) -> Result {
Ok(httpcodes::HTTPOk.into())
}
-/// somple handle
+/// async handler
fn index_async(req: HttpRequest) -> Once
{
println!("{:?}", req);
@@ -43,7 +43,7 @@ fn index_async(req: HttpRequest) -> Once
.into()))
}
-/// handle with path parameters like `/user/{name}/`
+/// handler with path parameters like `/user/{name}/`
fn with_param(req: HttpRequest) -> Result
{
println!("{:?}", req);
diff --git a/guide/book.toml b/guide/book.toml
new file mode 100644
index 000000000..185156e22
--- /dev/null
+++ b/guide/book.toml
@@ -0,0 +1,3 @@
+title = "Actix web"
+description = "Actix web framework guide"
+author = "Actix Project and Contributors"
diff --git a/guide/src/SUMMARY.md b/guide/src/SUMMARY.md
new file mode 100644
index 000000000..97c88675a
--- /dev/null
+++ b/guide/src/SUMMARY.md
@@ -0,0 +1,4 @@
+# Summary
+
+[Quickstart](./qs_1.md)
+- [Getting Started](./qs_2.md)
diff --git a/guide/src/qs_1.md b/guide/src/qs_1.md
new file mode 100644
index 000000000..09e83b586
--- /dev/null
+++ b/guide/src/qs_1.md
@@ -0,0 +1,34 @@
+# Quickstart
+
+Before you can start writing a actix web application, you’ll need a version of Rust installed.
+We recommend you use rustup to install or configure such a version.
+
+## Install Rust
+
+Before we begin, we need to install Rust using the [rustup](https://www.rustup.rs/) installer:
+
+```bash
+curl https://sh.rustup.rs -sSf | sh
+```
+
+If you already have rustup installed, run this command to ensure you have the latest version of Rust:
+
+```bash
+rustup update
+```
+
+Actix web framework requies rust version 1.20 and up.
+
+## Running Examples
+
+The fastest way to start experimenting with actix web is to clone the actix web repository
+and run the included examples in the examples/ directory. The following set of
+commands runs the `basic` example:
+
+```bash
+git clone https://github.com/actix/actix-web
+cd actix-web
+cargo run --example basic
+```
+
+Check `examples/` directory for more examples.
diff --git a/guide/src/qs_2.md b/guide/src/qs_2.md
new file mode 100644
index 000000000..823f56941
--- /dev/null
+++ b/guide/src/qs_2.md
@@ -0,0 +1,85 @@
+# Getting Started
+
+Let’s create and run our first actix web application. We’ll create a new Cargo project
+that depends on actix web and then run the application.
+
+In previous section we already installed required rust version. Now let's create new cargo projects.
+
+## Hello, world!
+
+Let’s write our first actix web application! Start by creating a new binary-based
+Cargo project and changing into the new directory:
+
+```bash
+cargo new hello-world --bin
+cd hello-world
+```
+
+Now, add actix and actix web as dependencies of your project by ensuring your Cargo.toml
+contains the following:
+
+```toml
+[dependencies]
+actix = "0.3"
+actix-web = { git = "https://github.com/actix/actix-web" }
+```
+
+In order to implement a web server, first we need to create a request handler.
+
+A request handler is a function that accepts a `HttpRequest` instance as its only parameter
+and returns a `HttpResponse` instance or actor that uses `HttpContext` as an actor's context::
+
+```rust,ignore
+extern crate actix_web;
+use actix_web::prelude::*;
+
+fn index(req: HttpRequest) -> Result {
+ Ok(httpcodes::HTTPOk.with_body("Hello world!"))
+}
+```
+
+Next, create an `Application` instance and register the
+request handler with the application's `resource` on a particular *HTTP method* and *path*::
+
+```rust,ignore
+ let app = Application::default("/")
+ .resource("/", |r| r.handler(Method::GET, index)
+ .finish()
+```
+
+After that, application instance can be used with `HttpServer` to listen for incoming
+connections:
+
+```rust,ignore
+ HttpServer::new(app).serve::<_, ()>("127.0.0.1:8088");
+```
+
+That's it. Now, compile and run the program with cargo run.
+Head over to ``http://localhost:8088/`` to see the results.
+
+Here is full source of main.rs file:
+
+```rust
+extern crate actix;
+extern crate actix_web;
+use actix_web::prelude::*;
+
+fn index(req: HttpRequest) -> Result {
+ Ok(httpcodes::HTTPOk.with_body("Hello world!"))
+}
+
+fn main() {
+ let sys = actix::System::new("example");
+
+ HttpServer::new(
+ Application::default("/")
+ .resource("/", |r| r.handler(Method::GET, index)))
+ .serve::<_, ()>("127.0.0.1:8088").unwrap();
+
+ println!("Started http server: 127.0.0.1:8088");
+ // do not copy this line
+ actix::Arbiter::system().send(actix::msgs::SystemExit(0));
+
+ let _ = sys.run();
+}
+```
diff --git a/src/prelude.rs b/src/prelude.rs
index 6f7a777ae..01c2a90eb 100644
--- a/src/prelude.rs
+++ b/src/prelude.rs
@@ -1,7 +1,6 @@
//! The `actix-web` prelude
pub use super::*;
-
pub use error::*;
pub use application::ApplicationBuilder;
pub use httpresponse::HttpResponseBuilder;