#![forbid(unsafe_code)]
use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct Truncated<'a>(pub(crate) &'a str);
impl<'a> Truncated<'a> {
#[must_use]
pub fn written(&self) -> &'a str {
self.0
}
#[must_use]
pub fn written_len(&self) -> usize {
self.0.len()
}
}
impl fmt::Debug for Truncated<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Truncated({:?})", self.0)
}
}
impl fmt::Display for Truncated<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt(f)
}
}
impl core::error::Error for Truncated<'_> {}
mod sealed {
pub trait Sealed {}
}
pub trait TruncatedResultExt<'a>: sealed::Sealed {
fn written(&self) -> &'a str;
fn written_len(&self) -> usize {
self.written().len()
}
fn is_truncated(&self) -> bool;
}
impl<'a> sealed::Sealed for Result<&'a str, Truncated<'a>> {}
impl<'a> TruncatedResultExt<'a> for Result<&'a str, Truncated<'a>> {
fn written(&self) -> &'a str {
match self {
Ok(s) => s,
Err(t) => t.written(),
}
}
fn is_truncated(&self) -> bool {
self.is_err()
}
}