use super::ui_map::UiMap;
pub struct UiMapFormatter {
pub max_elements: usize,
pub include_bounds: bool,
pub include_states: bool,
pub interactive_only: bool,
pub max_name_length: usize,
}
impl UiMapFormatter {
pub fn new() -> Self {
Self {
max_elements: 100,
include_bounds: true,
include_states: true,
interactive_only: false,
max_name_length: 50,
}
}
pub fn compact() -> Self {
Self {
max_elements: 40,
include_bounds: true,
include_states: true,
interactive_only: true,
max_name_length: 30,
}
}
pub fn format(&self, ui_map: &UiMap) -> String {
if self.interactive_only && ui_map.elements.len() > self.max_elements {
let mut output = String::new();
let elements = ui_map.interactive_elements();
for element in elements.iter().take(self.max_elements) {
use std::fmt::Write;
let role_str = element.role.to_hash_string();
let name_str = element
.name
.as_deref()
.map(|n| {
if n.len() > self.max_name_length {
let truncated: String =
n.chars().take(self.max_name_length - 3).collect();
format!(" \"{}...\"", truncated)
} else {
format!(" \"{}\"", n)
}
})
.unwrap_or_default();
let _ = writeln!(output, "[{}] {}{}", element.id, role_str, name_str);
}
output
} else {
ui_map.format_compact()
}
}
}
impl Default for UiMapFormatter {
fn default() -> Self {
Self::new()
}
}