use std::sync::Arc;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(deny_unknown_fields)]
pub struct SourcePosition {
line: u32,
column: u32,
}
impl SourcePosition {
pub fn new(line: u32, column: u32) -> Self {
Self { line, column }
}
pub fn line(self) -> u32 {
self.line
}
pub fn column(self) -> u32 {
self.column
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(deny_unknown_fields)]
pub struct SourceSpan {
file: Arc<str>,
start: SourcePosition,
end: SourcePosition,
}
impl SourceSpan {
pub fn new(file: Arc<str>, start: SourcePosition, end: SourcePosition) -> Self {
Self { file, start, end }
}
pub fn file(&self) -> &str {
&self.file
}
pub(super) fn shared_file(&self) -> &Arc<str> {
&self.file
}
pub(super) fn adopt_file(&mut self, file: Arc<str>) {
self.file = file;
}
pub fn start(&self) -> SourcePosition {
self.start
}
pub fn end(&self) -> SourcePosition {
self.end
}
}