diff options
Diffstat (limited to 'src/terminal')
| -rw-r--r-- | src/terminal/id.rs | 29 | ||||
| -rw-r--r-- | src/terminal/mod.rs | 3 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/terminal/id.rs b/src/terminal/id.rs new file mode 100644 index 00000000..53ef6786 --- /dev/null +++ b/src/terminal/id.rs @@ -0,0 +1,29 @@ +use std::fmt; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{SystemTime, UNIX_EPOCH}; + +/// Opaque identity for a server-owned terminal. +/// +/// During the pane-backed transition this is stored one-to-one beside panes, +/// but callers must not derive it from a pane id or layout position. +#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] +pub struct TerminalId(String); + +static NEXT_TERMINAL_ID: AtomicU64 = AtomicU64::new(1); + +impl TerminalId { + pub fn alloc() -> Self { + let micros = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_micros()) + .unwrap_or(0); + let counter = NEXT_TERMINAL_ID.fetch_add(1, Ordering::Relaxed); + Self(format!("term_{micros:x}{counter:x}")) + } +} + +impl fmt::Display for TerminalId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} diff --git a/src/terminal/mod.rs b/src/terminal/mod.rs new file mode 100644 index 00000000..489f7876 --- /dev/null +++ b/src/terminal/mod.rs @@ -0,0 +1,3 @@ +mod id; + +pub use id::TerminalId; |
