use crate::SourceSpan;
use std::{
borrow::Cow,
fmt::{Debug, Display, Formatter},
hash::{DefaultHasher, Hash, Hasher},
ops::Range,
path::PathBuf,
};
use url::Url;
mod display;
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SourcePath {
#[default]
Anonymous,
Snippet(Cow<'static, str>),
Local(PathBuf),
Remote(Url),
}
#[derive(Copy, Clone, Default, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SourceID {
pub(crate) hash: u64,
}
impl SourcePath {
pub fn source_id(&self) -> SourceID {
let mut hasher = DefaultHasher::new();
self.hash(&mut hasher);
SourceID { hash: hasher.finish() }
}
}
impl SourceID {
pub unsafe fn new(id: u64) -> Self {
Self { hash: id }
}
pub fn with_range(self, range: Range<u32>) -> SourceSpan {
SourceSpan { start: range.start, end: range.end, file: self }
}
}