use core::ops::Range;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Span {
pub range: Range<usize>,
pub value: Range<usize>,
pub line: usize,
pub column: usize,
}
#[derive(Debug, Clone, Default)]
pub struct Spans {
entries: HashMap<String, Span>,
}
impl Spans {
pub fn get(&self, path: &str) -> Option<&Span> {
if let Some(span) = self.entries.get(path) {
return Some(span);
}
let mut path = path;
while let Some((prefix, _)) = path.rsplit_once('.') {
if let Some(span) = self.entries.get(prefix) {
return Some(span);
}
path = prefix;
}
None
}
pub fn get_exact(&self, path: &str) -> Option<&Span> {
self.entries.get(path)
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = (&str, &Span)> {
self.entries
.iter()
.map(|(path, span)| (path.as_str(), span))
}
pub(crate) fn record(&mut self, path: String, span: Span) {
self.entries.insert(path, span);
}
}