use std::fmt;
use super::scalar_failure::ScalarFailure;
pub(in crate::runtime) struct InputCapture {
text: String,
maximum: usize,
presented: usize,
overflowed: bool,
}
impl InputCapture {
#[must_use]
#[inline(always)]
pub(in crate::runtime) fn new(maximum: usize) -> Self {
Self {
text: String::new(),
maximum,
presented: 0,
overflowed: false,
}
}
#[must_use]
#[inline(always)]
pub(in crate::runtime) fn usage(&self) -> (usize, usize) {
(self.presented, self.text.len())
}
pub(in crate::runtime) fn finish(self, result: fmt::Result) -> Result<String, ScalarFailure> {
if self.overflowed {
Err(ScalarFailure::InputLimit)
} else if result.is_err() {
Err(ScalarFailure::FormatterFailure)
} else {
Ok(self.text)
}
}
}
impl fmt::Write for InputCapture {
fn write_str(&mut self, value: &str) -> fmt::Result {
self.presented = self.presented.saturating_add(value.len());
if self.overflowed || value.len() > self.maximum.saturating_sub(self.text.len()) {
self.overflowed = true;
return Err(fmt::Error);
}
self.text.push_str(value);
Ok(())
}
}