use std::{ops::Deref, str::FromStr};
use unicase::Ascii;
use super::token::{InvalidEncodedToken, Token};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FieldParameterName(Ascii<Token>);
#[derive(Debug, Clone, thiserror::Error, PartialEq, Eq)]
pub enum InvalidEncodedFieldParameterName {
#[error("Given value is not a valid encoded token")]
InvalidToken(#[from] InvalidEncodedToken),
}
impl FromStr for FieldParameterName {
type Err = InvalidEncodedFieldParameterName;
#[inline]
fn from_str(s: &str) -> Result<Self, Self::Err> {
let token: Token = s.parse()?;
Ok(Self(Ascii::new(token)))
}
}
impl Deref for FieldParameterName {
type Target = Ascii<Token>;
#[inline]
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl From<FieldParameterName> for Ascii<Token> {
#[inline]
fn from(val: FieldParameterName) -> Self {
val.0
}
}
impl From<FieldParameterName> for Token {
#[inline]
fn from(val: FieldParameterName) -> Self {
let ascii_token: Ascii<Token> = val.into();
ascii_token.deref().clone()
}
}
impl FieldParameterName {
#[inline]
pub fn push_encoded_str(&self, buffer: &mut String) {
buffer.push_str(self.as_ref());
}
#[inline]
pub fn str_encode(&self) -> String {
let mut encoded = String::new();
self.push_encoded_str(&mut encoded);
encoded
}
#[inline]
pub fn as_token(&self) -> &Token {
self.0.deref()
}
}