use crate::core::{EString, ParseFragment, ToEString};
#[derive(Debug, PartialEq, Eq)]
pub struct Trim<T>(pub T);
impl<T> std::ops::Deref for Trim<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: std::fmt::Display> std::fmt::Display for Trim<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl<T> ParseFragment for Trim<T>
where
T: ParseFragment,
{
fn parse_frag(value: EString) -> crate::Result<Self> {
T::parse_frag(EString::from(value.trim())).map(Trim)
}
}
impl<T> ToEString for Trim<T>
where
T: ToEString,
{
fn to_estring(&self) -> EString {
self.0.to_estring()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_trim_string() {
let estr = EString::from(" 999 ");
match estr.parse::<Trim<&str>>() {
Ok(res) => assert_eq!(*res, "999"),
_ => unreachable!(),
}
}
#[test]
fn should_trim_and_convert_to_number() {
let estr = EString::from(" 999 ");
match estr.parse::<Trim<i32>>() {
Ok(res) => assert_eq!(*res, 999),
_ => unreachable!(),
}
}
}