use crate::__private::{IncomingField, IncomingName};
use crate::FieldRef;
use crate::field_ref::{IntoField, debug_field};
use std::fmt;
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct OwnedField {
position: usize,
name: String,
value: Vec<u8>,
}
impl OwnedField {
pub fn position(&self) -> usize {
self.position
}
pub fn name(&self) -> &str {
&self.name
}
pub fn value(&self) -> &[u8] {
&self.value
}
pub fn as_field_ref(&self) -> FieldRef<'_> {
FieldRef::new(self.position, &self.name, &self.value)
}
}
impl fmt::Debug for OwnedField {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
debug_field(
formatter,
"OwnedField",
self.position,
&self.name,
&self.value,
)
}
}
impl<'a> From<FieldRef<'a>> for OwnedField {
fn from(field: FieldRef<'a>) -> Self {
Self {
position: field.position(),
name: field.name().to_owned(),
value: field.value().to_vec(),
}
}
}
impl<'a, S> IntoField<'a, S> for &'a OwnedField {
fn into_field(self, _index: usize) -> IncomingField<'a> {
IncomingField {
position: self.position,
name: IncomingName::Text(&self.name),
value: &self.value,
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct OwnedFields {
fields: Vec<OwnedField>,
}
impl OwnedFields {
pub fn iter(&self) -> std::slice::Iter<'_, OwnedField> {
self.fields.iter()
}
pub fn as_slice(&self) -> &[OwnedField] {
&self.fields
}
pub fn len(&self) -> usize {
self.fields.len()
}
pub fn is_empty(&self) -> bool {
self.fields.is_empty()
}
pub fn values<'a>(&'a self, name: &'a str) -> impl Iterator<Item = &'a [u8]> + 'a {
self.fields
.iter()
.filter(move |field| field.name.eq_ignore_ascii_case(name))
.map(OwnedField::value)
}
}
impl<'a> Extend<FieldRef<'a>> for OwnedFields {
fn extend<I: IntoIterator<Item = FieldRef<'a>>>(&mut self, fields: I) {
self.fields.extend(fields.into_iter().map(OwnedField::from));
}
}
impl<'a> FromIterator<FieldRef<'a>> for OwnedFields {
fn from_iter<I: IntoIterator<Item = FieldRef<'a>>>(fields: I) -> Self {
Self {
fields: fields.into_iter().map(OwnedField::from).collect(),
}
}
}
impl<'a> IntoIterator for &'a OwnedFields {
type Item = &'a OwnedField;
type IntoIter = std::slice::Iter<'a, OwnedField>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl IntoIterator for OwnedFields {
type Item = OwnedField;
type IntoIter = std::vec::IntoIter<OwnedField>;
fn into_iter(self) -> Self::IntoIter {
self.fields.into_iter()
}
}