1use 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
13pub 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
24pub 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
51pub 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
74pub 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}