use std::fmt::Display;
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct Position {
pub lin_num: usize,
pub col_num: usize,
pub char_num: usize,
}
impl Display for Position {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "line {}, column {}", 1 + self.lin_num, 1 + self.col_num)
}
}
impl Position {
pub fn empty() -> Self {
Self {
lin_num: 0,
col_num: 0,
char_num: 0,
}
}
pub fn incr(&mut self, c: char) {
self.char_num += 1;
if c == '\n' {
self.lin_num += 1;
self.col_num = 0;
} else {
self.col_num += 1;
}
}
}
impl Default for Position {
fn default() -> Self {
Self::empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Range {
pub start: Position,
pub end: Position,
}
impl Range {
pub fn new(start: Position, end: Position) -> Self {
Self { start, end }
}
}
impl Display for Range {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "from {} to {} (exclusive)", self.start, self.end)
}
}