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}