use crate::headers::{
HeaderName, HeaderValue, Headers, Iter, IterMut, Names, ToHeaderValues, Values,
};
use async_std::sync::Sender;
use std::convert::TryInto;
use std::ops::{Deref, DerefMut};
#[derive(Debug)]
pub struct Trailers {
headers: Headers,
}
impl Trailers {
pub fn new() -> Self {
Self {
headers: Headers::new(),
}
}
pub fn insert(
&mut self,
name: impl TryInto<HeaderName>,
values: impl ToHeaderValues,
) -> crate::Result<Option<Vec<HeaderValue>>> {
self.headers.insert(name, values)
}
pub fn append(
&mut self,
name: impl TryInto<HeaderName>,
values: impl ToHeaderValues,
) -> crate::Result<()> {
self.headers.append(name, values)
}
pub fn get(&self, name: &HeaderName) -> Option<&Vec<HeaderValue>> {
self.headers.get(name)
}
pub fn get_mut(&mut self, name: &HeaderName) -> Option<&mut Vec<HeaderValue>> {
self.headers.get_mut(name)
}
pub fn remove(&mut self, name: &HeaderName) -> Option<Vec<HeaderValue>> {
self.headers.remove(name)
}
pub fn iter<'a>(&'a self) -> Iter<'a> {
self.headers.iter()
}
pub fn iter_mut<'a>(&'a mut self) -> IterMut<'a> {
self.headers.iter_mut()
}
pub fn names<'a>(&'a self) -> Names<'a> {
self.headers.names()
}
pub fn values<'a>(&'a self) -> Values<'a> {
self.headers.values()
}
}
impl Clone for Trailers {
fn clone(&self) -> Self {
Self {
headers: Headers {
headers: self.headers.headers.clone(),
},
}
}
}
impl Deref for Trailers {
type Target = Headers;
fn deref(&self) -> &Self::Target {
&self.headers
}
}
impl DerefMut for Trailers {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.headers
}
}
#[derive(Debug)]
pub struct TrailersSender {
sender: Sender<crate::Result<Trailers>>,
}
impl TrailersSender {
#[doc(hidden)]
pub fn new(sender: Sender<crate::Result<Trailers>>) -> Self {
Self { sender }
}
pub async fn send(self, trailers: crate::Result<Trailers>) {
self.sender.send(trailers).await
}
}