cookie/builder.rs
1use std::borrow::Cow;
2
3use crate::{Cookie, SameSite, Expiration};
4
5/// Structure that follows the builder pattern for building `Cookie` structs.
6///
7/// To construct a cookie:
8///
9/// 1. Call [`Cookie::build`] to start building.
10/// 2. Use any of the builder methods to set fields in the cookie.
11/// 3. Call [`CookieBuilder::finish()`] to retrieve the built cookie.
12///
13/// # Example
14///
15/// ```rust
16/// # extern crate cookie;
17/// use cookie::Cookie;
18/// use cookie::time::Duration;
19///
20/// # fn main() {
21/// let cookie: Cookie = Cookie::build("name", "value")
22/// .domain("www.rust-lang.org")
23/// .path("/")
24/// .secure(true)
25/// .http_only(true)
26/// .max_age(Duration::days(1))
27/// .finish();
28/// # }
29/// ```
30#[derive(Debug, Clone)]
31pub struct CookieBuilder<'c> {
32 /// The cookie being built.
33 cookie: Cookie<'c>,
34}
35
36impl<'c> CookieBuilder<'c> {
37 /// Creates a new `CookieBuilder` instance from the given name and value.
38 ///
39 /// This method is typically called indirectly via [`Cookie::build()`].
40 ///
41 /// # Example
42 ///
43 /// ```rust
44 /// use cookie::Cookie;
45 ///
46 /// let c = Cookie::build("foo", "bar").finish();
47 /// assert_eq!(c.name_value(), ("foo", "bar"));
48 /// ```
49 pub fn new<N, V>(name: N, value: V) -> Self
50 where N: Into<Cow<'c, str>>,
51 V: Into<Cow<'c, str>>
52 {
53 CookieBuilder { cookie: Cookie::new(name, value) }
54 }
55
56 /// Sets the `expires` field in the cookie being built.
57 ///
58 /// # Example
59 ///
60 /// ```rust
61 /// # extern crate cookie;
62 /// use cookie::{Cookie, Expiration};
63 /// use cookie::time::OffsetDateTime;
64 ///
65 /// # fn main() {
66 /// let c = Cookie::build("foo", "bar")
67 /// .expires(OffsetDateTime::now_utc())
68 /// .finish();
69 ///
70 /// assert!(c.expires().is_some());
71 ///
72 /// let c = Cookie::build("foo", "bar")
73 /// .expires(None)
74 /// .finish();
75 ///
76 /// assert_eq!(c.expires(), Some(Expiration::Session));
77 /// # }
78 /// ```
79 #[inline]
80 pub fn expires<E: Into<Expiration>>(mut self, when: E) -> Self {
81 self.cookie.set_expires(when);
82 self
83 }
84
85 /// Sets the `max_age` field in the cookie being built.
86 ///
87 /// # Example
88 ///
89 /// ```rust
90 /// # extern crate cookie;
91 /// use cookie::Cookie;
92 /// use cookie::time::Duration;
93 ///
94 /// # fn main() {
95 /// let c = Cookie::build("foo", "bar")
96 /// .max_age(Duration::minutes(30))
97 /// .finish();
98 ///
99 /// assert_eq!(c.max_age(), Some(Duration::seconds(30 * 60)));
100 /// # }
101 /// ```
102 #[inline]
103 pub fn max_age(mut self, value: time::Duration) -> Self {
104 self.cookie.set_max_age(value);
105 self
106 }
107
108 /// Sets the `domain` field in the cookie being built.
109 ///
110 /// # Example
111 ///
112 /// ```rust
113 /// use cookie::Cookie;
114 ///
115 /// let c = Cookie::build("foo", "bar")
116 /// .domain("www.rust-lang.org")
117 /// .finish();
118 ///
119 /// assert_eq!(c.domain(), Some("www.rust-lang.org"));
120 /// ```
121 pub fn domain<D: Into<Cow<'c, str>>>(mut self, value: D) -> Self {
122 self.cookie.set_domain(value);
123 self
124 }
125
126 /// Sets the `path` field in the cookie being built.
127 ///
128 /// # Example
129 ///
130 /// ```rust
131 /// use cookie::Cookie;
132 ///
133 /// let c = Cookie::build("foo", "bar")
134 /// .path("/")
135 /// .finish();
136 ///
137 /// assert_eq!(c.path(), Some("/"));
138 /// ```
139 pub fn path<P: Into<Cow<'c, str>>>(mut self, path: P) -> Self {
140 self.cookie.set_path(path);
141 self
142 }
143
144 /// Sets the `secure` field in the cookie being built.
145 ///
146 /// # Example
147 ///
148 /// ```rust
149 /// use cookie::Cookie;
150 ///
151 /// let c = Cookie::build("foo", "bar")
152 /// .secure(true)
153 /// .finish();
154 ///
155 /// assert_eq!(c.secure(), Some(true));
156 /// ```
157 #[inline]
158 pub fn secure(mut self, value: bool) -> Self {
159 self.cookie.set_secure(value);
160 self
161 }
162
163 /// Sets the `http_only` field in the cookie being built.
164 ///
165 /// # Example
166 ///
167 /// ```rust
168 /// use cookie::Cookie;
169 ///
170 /// let c = Cookie::build("foo", "bar")
171 /// .http_only(true)
172 /// .finish();
173 ///
174 /// assert_eq!(c.http_only(), Some(true));
175 /// ```
176 #[inline]
177 pub fn http_only(mut self, value: bool) -> Self {
178 self.cookie.set_http_only(value);
179 self
180 }
181
182 /// Sets the `same_site` field in the cookie being built.
183 ///
184 /// # Example
185 ///
186 /// ```rust
187 /// use cookie::{Cookie, SameSite};
188 ///
189 /// let c = Cookie::build("foo", "bar")
190 /// .same_site(SameSite::Strict)
191 /// .finish();
192 ///
193 /// assert_eq!(c.same_site(), Some(SameSite::Strict));
194 /// ```
195 #[inline]
196 pub fn same_site(mut self, value: SameSite) -> Self {
197 self.cookie.set_same_site(value);
198 self
199 }
200
201 /// Makes the cookie being built 'permanent' by extending its expiration and
202 /// max age 20 years into the future.
203 ///
204 /// # Example
205 ///
206 /// ```rust
207 /// # extern crate cookie;
208 /// use cookie::Cookie;
209 /// use cookie::time::Duration;
210 ///
211 /// # fn main() {
212 /// let c = Cookie::build("foo", "bar")
213 /// .permanent()
214 /// .finish();
215 ///
216 /// assert_eq!(c.max_age(), Some(Duration::days(365 * 20)));
217 /// # assert!(c.expires().is_some());
218 /// # }
219 /// ```
220 #[inline]
221 pub fn permanent(mut self) -> Self {
222 self.cookie.make_permanent();
223 self
224 }
225
226 /// Finishes building and returns the built `Cookie`.
227 ///
228 /// # Example
229 ///
230 /// ```rust
231 /// use cookie::Cookie;
232 ///
233 /// let c = Cookie::build("foo", "bar")
234 /// .domain("crates.io")
235 /// .path("/")
236 /// .finish();
237 ///
238 /// assert_eq!(c.name_value(), ("foo", "bar"));
239 /// assert_eq!(c.domain(), Some("crates.io"));
240 /// assert_eq!(c.path(), Some("/"));
241 /// ```
242 #[inline]
243 pub fn finish(self) -> Cookie<'c> {
244 self.cookie
245 }
246}