use std::fmt;
pub mod lexical;
pub mod syntax;
#[cfg(doctest)]
use doc_comment::doctest;
#[cfg(doctest)]
doctest!("../README.md");
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub struct Pos {
pub offset: usize,
pub line: usize,
pub col: usize,
}
impl Pos {
#[inline(always)]
pub fn new(offset: usize, line: usize, col: usize) -> Self {
Self { offset, line, col }
}
#[inline(always)]
pub(crate) fn advance_line(&mut self) {
self.offset += 1;
self.line += 1;
self.col = 1;
}
#[inline(always)]
pub(crate) fn advance_line_no_offset(&mut self) {
self.line += 1;
self.col = 1;
}
#[inline(always)]
pub(crate) fn advance_col(&mut self) {
self.offset += 1;
self.col += 1;
}
#[inline(always)]
pub(crate) fn advance_offset(&mut self, by: usize) {
self.offset += by;
}
}
impl Default for Pos {
fn default() -> Self {
Self {
offset: 0,
line: 1,
col: 1,
}
}
}
impl fmt::Display for Pos {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"line {}, column {} (offset: {})",
self.line, self.col, self.offset
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pos_new() {
assert_eq!(
Pos {
offset: 1,
line: 2,
col: 3
},
Pos::new(1, 2, 3)
);
}
#[test]
fn test_pos_default() {
assert_eq!(
Pos {
offset: 0,
line: 1,
col: 1
},
Pos::default()
);
}
#[test]
fn test_pos_display() {
assert_eq!(
"line 1, column 1 (offset: 0)",
format!("{}", Pos::default())
);
assert_eq!(
"line 77, column 8 (offset: 103)",
format!("{}", Pos::new(103, 77, 8))
);
}
}