1use 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
13pub 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
24pub 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
54pub 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
77pub 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}