aboutsummaryrefslogtreecommitdiffstats
path: root/src/unist.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/unist.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/unist.rs b/src/unist.rs
new file mode 100644
index 0000000..75ef359
--- /dev/null
+++ b/src/unist.rs
@@ -0,0 +1,75 @@
+//! abstract syntax trees: [unist][].
+//!
+//! [unist]: https://github.com/syntax-tree/unist
+
+use alloc::fmt;
+
+/// One place in a source file.
+#[derive(Clone, Eq, PartialEq)]
+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)]
+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
+ )
+ }
+}