source_cache/identifier/
mod.rs1use crate::SourceSpan;
2use std::{
3 borrow::Cow,
4 fmt::{Debug, Display, Formatter},
5 hash::{DefaultHasher, Hash, Hasher},
6 ops::Range,
7 path::PathBuf,
8};
9use url::Url;
10
11mod display;
12
13#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16pub enum SourcePath {
17 #[default]
19 Anonymous,
20 Snippet(Cow<'static, str>),
22 Local(PathBuf),
24 Remote(Url),
26}
27
28#[derive(Copy, Clone, Default, Eq, PartialEq, Hash)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31pub struct SourceID {
32 pub(crate) hash: u64,
33}
34
35impl SourcePath {
36 pub fn source_id(&self) -> SourceID {
38 let mut hasher = DefaultHasher::new();
39 self.hash(&mut hasher);
40 SourceID { hash: hasher.finish() }
41 }
42}
43
44impl SourceID {
45 pub unsafe fn new(id: u64) -> Self {
47 Self { hash: id }
48 }
49
50 pub fn with_range(self, range: Range<u32>) -> SourceSpan {
52 SourceSpan { start: range.start, end: range.end, file: self }
53 }
54}