use crate::form::{
error::{Entity, Error, ErrorKind},
name::NameView,
};
use crate::fs::FileName;
use crate::http::{ContentType, RawStr};
use crate::{Data, Request};
#[derive(Debug, Clone)]
pub struct ValueField<'r> {
pub name: NameView<'r>,
pub value: &'r str,
}
pub struct DataField<'r, 'i> {
pub name: NameView<'r>,
pub file_name: Option<&'r FileName>,
pub content_type: ContentType,
pub request: &'r Request<'i>,
pub data: Data<'r>,
}
impl<'v> ValueField<'v> {
pub fn parse(field: &'v str) -> Self {
let (name, val) = RawStr::new(field).split_at_byte(b'=');
ValueField::from((name.as_str(), val.as_str()))
}
pub fn from_value(value: &'v str) -> Self {
ValueField::from(("", value))
}
pub fn shift(mut self) -> Self {
self.name.shift();
self
}
pub fn unexpected(&self) -> Error<'v> {
Error::from(ErrorKind::Unexpected)
.with_name(self.name.source())
.with_value(self.value)
.with_entity(Entity::ValueField)
}
pub fn missing(&self) -> Error<'v> {
Error::from(ErrorKind::Missing)
.with_name(self.name.source())
.with_value(self.value)
.with_entity(Entity::ValueField)
}
}
impl<'v> DataField<'v, '_> {
pub fn shift(mut self) -> Self {
self.name.shift();
self
}
pub fn unexpected(&self) -> Error<'v> {
Error::from(ErrorKind::Unexpected)
.with_name(self.name.source())
.with_entity(Entity::DataField)
}
}
impl<'a> From<(&'a str, &'a str)> for ValueField<'a> {
fn from((name, value): (&'a str, &'a str)) -> Self {
ValueField {
name: NameView::new(name),
value,
}
}
}
impl<'a, 'b> PartialEq<ValueField<'b>> for ValueField<'a> {
fn eq(&self, other: &ValueField<'b>) -> bool {
self.name == other.name && self.value == other.value
}
}