diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 01:41:16 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 01:41:16 +0300 |
| commit | 86adf88351e17c6a11cac253714b169eac0db233 (patch) | |
| tree | 883d32b0126e0b69449e0e9c0a7017d279c23935 /src/terminal | |
| parent | d2aa8865911ded97a67054fb2392a1c12fae018c (diff) | |
feat: add terminal identity and agent cli facade
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; |
