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.rs | 35 |
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}]"), } } } |