use crate::console::{Console, ConsoleOptions};
use crate::protocol::Renderable;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Measurement {
pub minimum: usize,
pub maximum: usize,
}
impl Measurement {
pub fn new(minimum: usize, maximum: usize) -> Self {
Measurement { minimum, maximum }
}
pub fn normalize(&self) -> Measurement {
let minimum = self.minimum.min(self.maximum);
Measurement::new(minimum, self.maximum.max(minimum))
}
pub fn with_maximum(&self, width: usize) -> Measurement {
Measurement::new(self.minimum.min(width), self.maximum.min(width))
}
pub fn get(console: &Console, options: &ConsoleOptions, renderable: &dyn Renderable) -> Self {
let max_width = options.max_width;
if max_width < 1 {
return Measurement::new(0, 0);
}
let width = renderable
.measure(console, options)
.normalize()
.with_maximum(max_width);
if width.maximum < 1 {
return Measurement::new(0, 0);
}
width.normalize()
}
pub fn clamp(&self, min_width: Option<usize>, max_width: Option<usize>) -> Measurement {
let mut minimum = self.minimum;
let mut maximum = self.maximum;
if let Some(lo) = min_width {
minimum = minimum.max(lo);
maximum = maximum.max(lo);
}
if let Some(hi) = max_width {
minimum = minimum.min(hi);
maximum = maximum.min(hi);
}
Measurement { minimum, maximum }
}
}