Skip to main content

cookie_store/
serde.rs

1//! De/serialization functionality
2//! Requires feature `serde`
3
4use std::io::{BufRead, Write};
5
6use crate::{cookie_store::StoreResult, Cookie, CookieStore};
7
8#[cfg(feature = "serde_json")]
9pub mod json;
10#[cfg(feature = "serde_ron")]
11pub mod ron;
12
13/// Load cookies from `reader`, deserializing with `cookie_from_str`, skipping any __expired__
14/// cookies
15pub fn load<R, E, F>(reader: R, cookies_from_str: F) -> StoreResult<CookieStore>
16where
17    R: BufRead,
18    F: Fn(&str) -> Result<Vec<Cookie<'static>>, E>,
19    crate::Error: From<E>,
20{
21    load_from(reader, cookies_from_str, false)
22}
23
24/// Load cookies from `reader`, deserializing with `cookie_from_str`, loading both __unexpired__
25/// and __expired__ cookies
26pub fn load_all<R, E, F>(reader: R, cookies_from_str: F) -> StoreResult<CookieStore>
27where
28    R: BufRead,
29    F: Fn(&str) -> Result<Vec<Cookie<'static>>, E>,
30    crate::Error: From<E>,
31{
32    load_from(reader, cookies_from_str, true)
33}
34
35fn load_from<R, E, F>(
36    mut reader: R,
37    cookies_from_str: F,
38    include_expired: bool,
39) -> StoreResult<CookieStore>
40where
41    R: BufRead,
42    F: Fn(&str) -> Result<Vec<Cookie<'static>>, E>,
43    crate::Error: From<E>,
44{
45    let mut cookie_store = String::new();
46    reader.read_to_string(&mut cookie_store)?;
47    let cookies = cookies_from_str(&cookie_store)?;
48    CookieStore::from_cookies(cookies.into_iter().map(Ok), include_expired)
49}
50
51/// Serialize any __unexpired__ and __persistent__ cookies in the store with `cookie_to_string`
52/// and write them to `writer`
53pub fn save<W, E, F>(
54    cookie_store: &CookieStore,
55    writer: &mut W,
56    cookies_to_string: F,
57) -> StoreResult<()>
58where
59    W: Write,
60    F: Fn(&Vec<Cookie<'static>>) -> Result<String, E>,
61    crate::Error: From<E>,
62{
63    let mut cookies = Vec::new();
64    for cookie in cookie_store.iter_unexpired() {
65        if cookie.is_persistent() {
66            cookies.push(cookie.clone());
67        }
68    }
69    let cookies = cookies_to_string(&cookies);
70    writeln!(writer, "{}", cookies?)?;
71    Ok(())
72}
73
74/// Serialize all (including __expired__ and __non-persistent__) cookies in the store with `cookie_to_string` and write them to `writer`
75pub fn save_incl_expired_and_nonpersistent<W, E, F>(
76    cookie_store: &CookieStore,
77    writer: &mut W,
78    cookies_to_string: F,
79) -> StoreResult<()>
80where
81    W: Write,
82    F: Fn(&Vec<Cookie<'static>>) -> Result<String, E>,
83    crate::Error: From<E>,
84{
85    let mut cookies = Vec::new();
86    for cookie in cookie_store.iter_any() {
87        cookies.push(cookie.clone());
88    }
89    let cookies = cookies_to_string(&cookies);
90    writeln!(writer, "{}", cookies?)?;
91    Ok(())
92}