//! abstract syntax trees: [unist][].
//!
//! [unist]: https://github.com/syntax-tree/unist
use alloc::fmt;
/// One place in a source file.
#[derive(Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Point {
/// 1-indexed integer representing a line in a source file.
pub line: usize,
/// 1-indexed integer representing a column in a source file.
pub column: usize,
/// 0-indexed integer representing a character in a source file.
pub offset: usize,
}
impl Point {
#[must_use]
pub fn new(line: usize, column: usize, offset: usize) -> Point {
Point {
line,
column,
offset,
}
}
}
impl fmt::Debug for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}:{} ({})", self.line, self.column, self.offset)
}
}
/// Location of a node in a source file.
#[derive(Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Position {
/// Represents the place of the first character of the parsed source region.
pub start: Point,
/// Represents the place of the first character after the parsed source
/// region, whether it exists or not.
pub end: Point,
}
impl Position {
#[must_use]
pub fn new(
start_line: usize,
start_column: usize,
start_offset: usize,
end_line: usize,
end_column: usize,
end_offset: usize,
) -> Position {
Position {
start: Point::new(start_line, start_column, start_offset),
end: Point::new(end_line, end_column, end_offset),
}
}
}
impl fmt::Debug for Position {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}:{}-{}:{} ({}-{})",
self.start.line,
self.start.column,
self.end.line,
self.end.column,
self.start.offset,
self.end.offset
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::format;
#[test]
fn point() {
let point = Point::new(1, 1, 0);
assert_eq!(
format!("{:?}", point),
"1:1 (0)",
"should support `Debug` on unist points"
);
}
#[test]
fn position() {
let position = Position::new(1, 1, 0, 1, 3, 2);
assert_eq!(
format!("{:?}", position),
"1:1-1:3 (0-2)",
"should support `Debug` on unist positions"
);
}
}