use cookie::{Cookie, CookieJar as RawCookieJar, Key};
use crate::Cookies;
#[derive(Debug, Clone, Copy)]
pub struct SignedJar<'key, J> {
inner: J,
key: &'key Key,
}
impl<'key, J> SignedJar<'key, J> {
pub(crate) fn new(inner: J, key: &'key Key) -> Self {
Self { inner, key }
}
}
impl<J: Cookies> Cookies for SignedJar<'_, J> {
fn get(&self, name: &str) -> Option<Cookie<'static>> {
let raw = self.inner.get(name)?;
let name = raw.name().to_owned();
let mut jar = RawCookieJar::new();
jar.add_original(raw);
jar.signed(self.key).get(&name)
}
fn add<C: Into<Cookie<'static>>>(&self, cookie: C) {
let cookie = cookie.into();
let name = cookie.name().to_owned();
let mut jar = RawCookieJar::new();
jar.signed_mut(self.key).add(cookie);
if let Some(signed) = jar.get(&name).cloned() {
self.inner.add(signed);
}
}
fn remove<C: Into<Cookie<'static>>>(&self, cookie: C) {
self.inner.remove(cookie);
}
}