use crate::Widget;
use std::fmt::Write;
pub(crate) type PathCheckpoint = usize;
pub(crate) struct WidgetPath {
buf: String,
}
impl WidgetPath {
pub(crate) fn new() -> Self {
Self { buf: String::new() }
}
#[inline]
pub(crate) fn as_str(&self) -> &str {
&self.buf
}
#[inline]
pub(crate) fn checkpoint(&self) -> PathCheckpoint {
self.buf.len()
}
#[inline]
pub(crate) fn restore(&mut self, checkpoint: PathCheckpoint) {
self.buf.truncate(checkpoint);
}
pub(crate) fn push(&mut self, widget: &dyn Widget, index: usize) {
if !self.buf.is_empty() {
self.buf.push('.');
}
if let Some(key) = widget.get_key() {
self.buf.push('k');
self.buf.push_str(key);
} else {
write!(&mut self.buf, "{index}").unwrap();
}
}
}