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
use crate::http::headers::{HeaderName, ToHeaderValues};
use crate::http::{Body, Mime, StatusCode};
use crate::Response;
use std::convert::TryInto;

#[derive(Debug)]

/// Response Builder

///

/// Provides an ergonomic way to chain the creation of a response. This is generally accessed through [`Response::builder`](crate::Response::builder)

///

/// # Example

/// ```rust

/// # use tide::{StatusCode, Response, http::mime};

/// # async_std::task::block_on(async move {

/// let mut response = Response::builder(203)

///     .body("body")

///     .content_type(mime::HTML)

///     .header("custom-header", "value")

///     .build();

///

/// assert_eq!(response.take_body().into_string().await.unwrap(), "body");

/// assert_eq!(response.status(), StatusCode::NonAuthoritativeInformation);

/// assert_eq!(response["custom-header"], "value");

/// assert_eq!(response.content_type(), Some(mime::HTML));

/// # });


pub struct ResponseBuilder(Response);

impl ResponseBuilder {
    pub(crate) fn new<S>(status: S) -> Self
    where
        S: TryInto<StatusCode>,
        S::Error: std::fmt::Debug,
    {
        Self(Response::new(status))
    }

    /// Returns the inner Response

    pub fn build(self) -> Response {
        self.0
    }

    /// Sets a header on the response.

    /// ```

    /// # use tide::Response;

    /// let response = Response::builder(200).header("header-name", "header-value").build();

    /// assert_eq!(response["header-name"], "header-value");

    /// ```

    pub fn header(mut self, key: impl Into<HeaderName>, value: impl ToHeaderValues) -> Self {
        self.0.insert_header(key, value);
        self
    }

    /// Sets the Content-Type header on the response.

    /// ```

    /// # use tide::{http::mime, Response};

    /// let response = Response::builder(200).content_type(mime::HTML).build();

    /// assert_eq!(response["content-type"], "text/html;charset=utf-8");

    /// ```

    pub fn content_type(mut self, content_type: impl Into<Mime>) -> Self {
        self.0.set_content_type(content_type);
        self
    }

    /// Sets the body of the response.

    /// ```

    /// # async_std::task::block_on(async move {

    /// # use tide::{Response, convert::json};

    /// let mut response = Response::builder(200).body(json!({ "any": "Into<Body>"})).build();

    /// assert_eq!(response.take_body().into_string().await.unwrap(), "{\"any\":\"Into<Body>\"}");

    /// # });

    /// ```

    pub fn body(mut self, body: impl Into<Body>) -> Self {
        self.0.set_body(body);
        self
    }
}

impl Into<Response> for ResponseBuilder {
    fn into(self) -> Response {
        self.build()
    }
}