ailloli_ui_terminal_core/
hyperlink.rs

1//! OSC 8 terminal hyperlink identities and payloads.
2
3use serde::{Deserialize, Serialize};
4
5/// Opaque session-local hyperlink identity.
6///
7/// Every `u64`, including zero, is representable; uniqueness is a caller
8/// responsibility.
9///
10/// # Examples
11///
12/// ```
13/// use ailloli_ui_terminal_core::TerminalHyperlinkId;
14/// assert_eq!(TerminalHyperlinkId(9).0, 9);
15/// ```
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
17pub struct TerminalHyperlinkId(
18    /// Raw session-local numeric identity.
19    pub u64,
20);
21
22/// Stored OSC 8 hyperlink definition.
23///
24/// URI syntax and OSC parameter grammar are intentionally not validated by
25/// this value type; empty strings are valid and preserved.
26///
27/// # Examples
28///
29/// ```
30/// use ailloli_ui_terminal_core::{TerminalHyperlink, TerminalHyperlinkId};
31/// let link = TerminalHyperlink::new(TerminalHyperlinkId(1), "https://example.com", "id=docs");
32/// assert_eq!(link.uri, "https://example.com");
33/// ```
34#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
35pub struct TerminalHyperlink {
36    /// Identity referenced by linked terminal cells.
37    pub id: TerminalHyperlinkId,
38    /// Target text, normally a URI but stored verbatim.
39    pub uri: String,
40    /// OSC 8 parameter text stored verbatim.
41    pub params: String,
42}
43
44impl TerminalHyperlink {
45    /// Stores an identity, URI, and parameter string without validation.
46    ///
47    /// # Examples
48    ///
49    /// ```
50    /// use ailloli_ui_terminal_core::{TerminalHyperlink, TerminalHyperlinkId};
51    /// let link = TerminalHyperlink::new(TerminalHyperlinkId(0), "", "");
52    /// assert!(link.uri.is_empty() && link.params.is_empty());
53    /// ```
54    pub fn new(id: TerminalHyperlinkId, uri: impl Into<String>, params: impl Into<String>) -> Self {
55        Self {
56            id,
57            uri: uri.into(),
58            params: params.into(),
59        }
60    }
61}