Skip to content

Commit f8d00ad

Browse files
authored
Merge pull request #156 from aturon/revamp
Revamp Tide, dropping Extractors and simplifying the framework
2 parents d14e8f8 + adba649 commit f8d00ad

36 files changed

+984
-2268
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ version = "0.0.5"
1515
[dependencies]
1616
cookie = "0.11"
1717
futures-preview = "0.3.0-alpha.13"
18+
fnv = "1.0.6"
1819
http = "0.1"
1920
http-service = "0.1.4"
20-
path-table = "1.0.0"
2121
pin-utils = "0.1.0-alpha.4"
22+
route-recognizer = "0.1.12"
2223
serde = "1.0.80"
2324
serde_derive = "1.0.80"
2425
serde_json = "1.0.32"
@@ -46,3 +47,5 @@ basic-cookies = "0.1.3"
4647
juniper = "0.10.0"
4748
structopt = "0.2.14"
4849
http-service-mock = "0.1.0"
50+
serde = "1.0.80"
51+
serde_derive = "1.0.80"

examples/body_types.rs

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,51 @@
1-
#![feature(async_await, futures_api)]
1+
#![feature(async_await, futures_api, await_macro)]
22

33
#[macro_use]
44
extern crate serde_derive;
5-
use tide::body;
5+
6+
use tide::{
7+
error::ResultExt,
8+
forms::{self, ExtractForms},
9+
response, App, Context, EndpointResult,
10+
};
611

712
#[derive(Serialize, Deserialize, Clone, Debug)]
813
struct Message {
914
author: Option<String>,
1015
contents: String,
1116
}
1217

13-
async fn echo_string(msg: body::Str) -> String {
14-
println!("String: {}", *msg);
15-
format!("{}", *msg)
16-
}
17-
18-
async fn echo_string_lossy(msg: body::StrLossy) -> String {
19-
println!("String: {}", *msg);
20-
format!("{}", *msg)
21-
}
22-
23-
async fn echo_vec(msg: body::Bytes) -> Vec<u8> {
24-
println!("Vec<u8>: {:?}", *msg);
25-
msg.to_vec()
26-
}
27-
28-
async fn echo_bytes(msg: body::Bytes) -> body::Bytes {
29-
println!("Bytes: {:?}", *msg);
18+
async fn echo_string(mut cx: Context<()>) -> String {
19+
let msg = await!(cx.body_string()).unwrap();
20+
println!("String: {}", msg);
3021
msg
3122
}
3223

33-
async fn echo_json(msg: body::Json<Message>) -> body::Json<Message> {
34-
println!("JSON: {:?}", *msg);
35-
24+
async fn echo_bytes(mut cx: Context<()>) -> Vec<u8> {
25+
let msg = await!(cx.body_bytes()).unwrap();
26+
println!("Bytes: {:?}", msg);
3627
msg
3728
}
3829

39-
async fn echo_form(msg: body::Form<Message>) -> body::Form<Message> {
40-
println!("Form: {:?}", *msg);
30+
async fn echo_json(mut cx: Context<()>) -> EndpointResult {
31+
let msg = await!(cx.body_json()).client_err()?;
32+
println!("JSON: {:?}", msg);
33+
Ok(response::json(msg))
34+
}
4135

42-
msg
36+
async fn echo_form(mut cx: Context<()>) -> EndpointResult {
37+
let msg = await!(cx.body_form())?;
38+
println!("Form: {:?}", msg);
39+
Ok(forms::form(msg))
4340
}
4441

4542
fn main() {
46-
let mut app = tide::App::new(());
43+
let mut app = App::new(());
4744

4845
app.at("/echo/string").post(echo_string);
49-
app.at("/echo/string_lossy").post(echo_string_lossy);
50-
app.at("/echo/vec").post(echo_vec);
5146
app.at("/echo/bytes").post(echo_bytes);
5247
app.at("/echo/json").post(echo_json);
5348
app.at("/echo/form").post(echo_form);
5449

55-
app.serve();
50+
app.serve("127.0.0.1:8000").unwrap();
5651
}

examples/catch_all.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
#![feature(async_await, futures_api)]
22

3-
async fn echo_path(path: tide::head::Path<String>) -> String {
4-
format!("Your path is: {}", *path)
3+
use tide::Context;
4+
5+
async fn echo_path(cx: Context<()>) -> String {
6+
let path: String = cx.param("path").unwrap();
7+
format!("Your path is: {}", path)
58
}
69

710
fn main() {
811
let mut app = tide::App::new(());
9-
app.at("/echo_path").nest(|router| {
10-
router.at("*").get(echo_path);
11-
});
12-
13-
app.serve();
12+
app.at("/echo_path/:path*").get(echo_path);
13+
app.serve("127.0.0.1:8000").unwrap();
1414
}

examples/cli_parsing.rs

Lines changed: 0 additions & 48 deletions
This file was deleted.

examples/computed_values.rs

Lines changed: 0 additions & 38 deletions
This file was deleted.

examples/configuration.rs

Lines changed: 0 additions & 34 deletions
This file was deleted.

examples/cookie_extractor.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
#![feature(async_await, futures_api)]
22

3-
use tide::Cookies;
3+
use tide::{cookies::ExtractCookies, Context};
44

55
/// Tide will use the the `Cookies`'s `Extract` implementation to build this parameter.
66
///
7-
async fn hello_cookies(cookies: Cookies) -> String {
8-
format!("hello cookies: {:?}", cookies)
7+
async fn hello_cookies(mut cx: Context<()>) -> String {
8+
format!("hello cookies: {:?}", cx.cookie("hello"))
99
}
1010

1111
fn main() {
1212
let mut app = tide::App::new(());
1313
app.at("/").get(hello_cookies);
14-
15-
let address = "127.0.0.1:8000".to_owned();
16-
println!("Server is listening on http://{}", address);
17-
app.serve();
14+
app.serve("127.0.0.1:8000").unwrap();
1815
}

examples/default_handler.rs

Lines changed: 0 additions & 13 deletions
This file was deleted.

examples/default_headers.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fn main() {
1111
.header("X-Server", "Tide"),
1212
);
1313

14-
app.at("/").get(async || "Hello, world!");
14+
app.at("/").get(async move |_| "Hello, world!");
1515

16-
app.serve();
16+
app.serve("127.0.0.1:8000").unwrap();
1717
}

examples/graphql.rs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,26 @@
33
//
44
// [the Juniper book]: https://graphql-rust.github.io/
55

6-
#![feature(async_await, futures_api)]
6+
#![feature(async_await, futures_api, await_macro)]
77

88
use http::status::StatusCode;
99
use juniper::graphql_object;
1010
use std::sync::{atomic, Arc};
11-
use tide::{body, App, AppData, IntoResponse, Response};
11+
use tide::{error::ResultExt, response, App, Context, EndpointResult};
1212

13-
// First, we define `Context` that holds accumulator state. This is accessible as App data in
13+
// First, we define `Data` that holds accumulator state. This is accessible as App data in
1414
// Tide, and as executor context in Juniper.
1515
#[derive(Clone, Default)]
16-
struct Context(Arc<atomic::AtomicIsize>);
16+
struct Data(Arc<atomic::AtomicIsize>);
1717

18-
impl juniper::Context for Context {}
18+
impl juniper::Context for Data {}
1919

2020
// We define `Query` unit struct here. GraphQL queries will refer to this struct. The struct itself
2121
// doesn't have any associated data (and there's no need to do so), but instead it exposes the
2222
// accumulator state from the context.
2323
struct Query;
2424

25-
graphql_object!(Query: Context |&self| {
25+
graphql_object!(Query: Data |&self| {
2626
// GraphQL integers are signed and 32 bits long.
2727
field accumulator(&executor) -> i32 as "Current value of the accumulator" {
2828
executor.context().0.load(atomic::Ordering::Relaxed) as i32
@@ -33,7 +33,7 @@ graphql_object!(Query: Context |&self| {
3333
// `Query`, but it provides the way to "mutate" the accumulator state.
3434
struct Mutation;
3535

36-
graphql_object!(Mutation: Context |&self| {
36+
graphql_object!(Mutation: Data |&self| {
3737
field add(&executor, by: i32) -> i32 as "Add given value to the accumulator." {
3838
executor.context().0.fetch_add(by as isize, atomic::Ordering::Relaxed) as i32 + by
3939
}
@@ -45,23 +45,21 @@ type Schema = juniper::RootNode<'static, Query, Mutation>;
4545

4646
// Finally, we'll bridge between Tide and Juniper. `GraphQLRequest` from Juniper implements
4747
// `Deserialize`, so we use `Json` extractor to deserialize the request body.
48-
async fn handle_graphql(
49-
ctx: AppData<Context>,
50-
query: body::Json<juniper::http::GraphQLRequest>,
51-
) -> Response {
52-
let response = query.execute(&Schema::new(Query, Mutation), &ctx);
48+
async fn handle_graphql(mut cx: Context<Data>) -> EndpointResult {
49+
let query: juniper::http::GraphQLRequest = await!(cx.body_json()).client_err()?;
50+
let response = query.execute(&Schema::new(Query, Mutation), cx.app_data());
5351
let status = if response.is_ok() {
5452
StatusCode::OK
5553
} else {
5654
StatusCode::BAD_REQUEST
5755
};
58-
body::Json(response).with_status(status).into_response()
56+
let mut resp = response::json(response);
57+
*resp.status_mut() = status;
58+
Ok(resp)
5959
}
6060

6161
fn main() {
62-
let mut app = App::new(Context::default());
63-
62+
let mut app = App::new(Data::default());
6463
app.at("/graphql").post(handle_graphql);
65-
66-
app.serve();
64+
app.serve("127.0.0.1:8000").unwrap();
6765
}

examples/hello.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
fn main() {
44
let mut app = tide::App::new(());
5-
app.at("/").get(async || "Hello, world!");
6-
7-
app.serve();
5+
app.at("/").get(async move |_| "Hello, world!");
6+
app.serve("127.0.0.1:8000").unwrap();
87
}

0 commit comments

Comments
 (0)