use std::collections::hash_map::Values;
use std::collections::HashMap;
use crate::{Processor, ResponseCookie, ResponseCookieId};
#[derive(Default, Debug, Clone)]
pub struct ResponseCookies<'c> {
cookies: HashMap<ResponseCookieId<'c>, ResponseCookie<'c>>,
}
impl<'c> ResponseCookies<'c> {
pub fn new() -> ResponseCookies<'c> {
ResponseCookies::default()
}
pub fn get<I: Into<ResponseCookieId<'c>>>(&self, id: I) -> Option<&ResponseCookie<'c>> {
let id = id.into();
self.cookies.get(&id)
}
pub fn insert<C: Into<ResponseCookie<'c>>>(&mut self, cookie: C) -> Option<ResponseCookie<'c>> {
let cookie = cookie.into();
self.cookies.insert(cookie.id(), cookie)
}
pub fn discard<I: Into<ResponseCookieId<'c>>>(&mut self, id: I) {
self.cookies.remove(&id.into());
}
pub fn iter(&self) -> Iter {
Iter {
cookies: self.cookies.values(),
}
}
}
impl<'a, 'c: 'a> ResponseCookies<'c> {
pub fn header_values(self, processor: &'a Processor) -> impl Iterator<Item = String> + 'a {
self.cookies
.into_values()
.map(|cookie| processor.process_outgoing(cookie).to_string())
}
}
pub struct Iter<'a, 'c> {
cookies: Values<'a, ResponseCookieId<'c>, ResponseCookie<'c>>,
}
impl<'a, 'c> Iterator for Iter<'a, 'c> {
type Item = &'a ResponseCookie<'c>;
fn next(&mut self) -> Option<&'a ResponseCookie<'c>> {
self.cookies.next()
}
}
#[cfg(test)]
mod test {
use super::ResponseCookies;
#[test]
#[allow(deprecated)]
fn simple() {
let mut c = ResponseCookies::new();
c.insert(("test", ""));
c.insert(("test2", ""));
c.discard("test");
assert!(c.get("test").is_none());
assert!(c.get("test2").is_some());
c.insert(("test3", ""));
c.discard("test2");
c.discard("test3");
assert!(c.get("test").is_none());
assert!(c.get("test2").is_none());
assert!(c.get("test3").is_none());
}
#[test]
fn set_is_send() {
fn is_send<T: Send>(_: T) -> bool {
true
}
assert!(is_send(ResponseCookies::new()))
}
}