Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-core/src/uri.rs')
-rw-r--r--helix-core/src/uri.rs35
1 files changed, 32 insertions, 3 deletions
diff --git a/helix-core/src/uri.rs b/helix-core/src/uri.rs
index cbe0fadd..c9d39ea6 100644
--- a/helix-core/src/uri.rs
+++ b/helix-core/src/uri.rs
@@ -1,18 +1,44 @@
use std::{
fmt,
+ num::NonZeroUsize,
path::{Path, PathBuf},
sync::Arc,
};
+// uses NonZeroUsize so Option<DocumentId> takes the same space
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
+pub struct DocumentId(NonZeroUsize);
+
+impl DocumentId {
+ pub const MAX: Self = Self(unsafe { NonZeroUsize::new_unchecked(usize::MAX) });
+
+ pub fn next(&self) -> Self {
+ // Safety: adding 1 from 1 is fine, probably impossible to reach usize max
+ Self(unsafe { NonZeroUsize::new_unchecked(self.0.get() + 1) })
+ }
+}
+
+impl Default for DocumentId {
+ fn default() -> DocumentId {
+ // Safety: 1 is non-zero
+ DocumentId(unsafe { NonZeroUsize::new_unchecked(1) })
+ }
+}
+
+impl std::fmt::Display for DocumentId {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{}", self.0)
+ }
+}
+
/// A generic pointer to a file location.
///
-/// Currently this type only supports paths to local files.
-///
-/// Cloning this type is cheap: the internal representation uses an Arc.
+/// Cloning this type is cheap: the internal representation uses an Arc or data which is Copy.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
#[non_exhaustive]
pub enum Uri {
File(Arc<Path>),
+ Scratch(DocumentId),
}
impl Uri {
@@ -21,12 +47,14 @@ impl Uri {
pub fn to_url(&self) -> Result<url::Url, ()> {
match self {
Uri::File(path) => url::Url::from_file_path(path),
+ Uri::Scratch(_) => Err(()),
}
}
pub fn as_path(&self) -> Option<&Path> {
match self {
Self::File(path) => Some(path),
+ Self::Scratch(_) => None,
}
}
}
@@ -41,6 +69,7 @@ impl fmt::Display for Uri {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::File(path) => write!(f, "{}", path.display()),
+ Self::Scratch(id) => write!(f, "[scratch {id}]"),
}
}
}