cookie_store/
serde.rs

1//! De/serialization functionality
2//! Requires feature `serde`
3
4use std::io::{BufRead, Write};
5
6use crate::{Cookie, cookie_store::StoreResult, 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>
16    where
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>
27    where
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>
40    where
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(
49        cookies.into_iter().map(|cookies| Ok(cookies)),
50        include_expired,
51    )
52}
53
54/// Serialize any __unexpired__ and __persistent__ cookies in the store with `cookie_to_string`
55/// and write them to `writer`
56pub fn save<W, E, F>(
57    cookie_store: &CookieStore,
58    writer: &mut W,
59    cookies_to_string: F,
60) -> StoreResult<()>
61    where
62    W: Write,
63    F: Fn(&Vec<Cookie<'static>>) -> Result<String, E>,
64    crate::Error: From<E>,
65{
66    let mut cookies = Vec::new();
67    for cookie in cookie_store.iter_unexpired() {
68        if cookie.is_persistent() {
69            cookies.push(cookie.clone());
70        }
71    }
72    let cookies = cookies_to_string(&cookies);
73    writeln!(writer, "{}", cookies?)?;
74    Ok(())
75}
76
77/// Serialize all (including __expired__ and __non-persistent__) cookies in the store with `cookie_to_string` and write them to `writer`
78pub fn save_incl_expired_and_nonpersistent<W, E, F>(
79    cookie_store: &CookieStore,
80    writer: &mut W,
81    cookies_to_string: F,
82) -> StoreResult<()>
83    where
84    W: Write,
85    F: Fn(&Vec<Cookie<'static>>) -> Result<String, E>,
86    crate::Error: From<E>,
87{
88    let mut cookies = Vec::new();
89    for cookie in cookie_store.iter_any() {
90        cookies.push(cookie.clone());
91    }
92    let cookies = cookies_to_string(&cookies);
93    writeln!(writer, "{}", cookies?)?;
94    Ok(())
95}