pub const OSC_START: &str = "\x1b]";
pub const START: &str = "\x1b]9;4;";
pub const OSC8_START: &str = "\x1b]8;;";
pub const END: &str = "\x1b\\";
pub const DELIMITER: char = ';';
pub const OSC0_SET_TITLE_AND_TAB: &str = "\x1b]0;";
pub const OSC1_SET_ICON: &str = "\x1b]1;";
pub const OSC2_SET_TITLE: &str = "\x1b]2;";
pub const BELL_TERMINATOR: &str = "\x07";
pub const OSC_CODE_TITLE_AND_ICON: &str = "0";
pub const OSC_CODE_ICON: &str = "1";
pub const OSC_CODE_TITLE: &str = "2";
pub const OSC_CODE_HYPERLINK: &str = "8";
use crate::{core::common::fast_stringify::{BufTextStorage, FastStringify},
generate_impl_display_for_fast_stringify};
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OscSequence {
SetTitleAndIcon(String),
SetIcon(String),
SetTitle(String),
HyperlinkStart { uri: String, id: Option<String> },
HyperlinkEnd,
}
impl FastStringify for OscSequence {
fn write_to_buf(&self, acc: &mut BufTextStorage) -> fmt::Result {
acc.push_str(OSC_START);
match self {
OscSequence::SetTitleAndIcon(title) => {
acc.push_str(OSC_CODE_TITLE_AND_ICON);
acc.push(DELIMITER);
acc.push_str(title);
}
OscSequence::SetIcon(icon) => {
acc.push_str(OSC_CODE_ICON);
acc.push(DELIMITER);
acc.push_str(icon);
}
OscSequence::SetTitle(title) => {
acc.push_str(OSC_CODE_TITLE);
acc.push(DELIMITER);
acc.push_str(title);
}
OscSequence::HyperlinkStart { uri, id } => {
acc.push_str(OSC_CODE_HYPERLINK);
acc.push(DELIMITER);
if let Some(link_id) = id {
acc.push_str(link_id);
}
acc.push(DELIMITER);
acc.push_str(uri);
}
OscSequence::HyperlinkEnd => {
acc.push_str(OSC_CODE_HYPERLINK);
acc.push(DELIMITER);
acc.push(DELIMITER);
}
}
acc.push_str(BELL_TERMINATOR);
Ok(())
}
fn write_buf_to_fmt(
&self,
acc: &BufTextStorage,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
f.write_str(&acc.clone())
}
}
generate_impl_display_for_fast_stringify!(OscSequence);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_osc_sequence_set_title_and_icon() {
let sequence = OscSequence::SetTitleAndIcon("My Title".to_string());
let result = sequence.to_string();
let expected = "\x1b]0;My Title\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_set_icon() {
let sequence = OscSequence::SetIcon("Icon Name".to_string());
let result = sequence.to_string();
let expected = "\x1b]1;Icon Name\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_set_title() {
let sequence = OscSequence::SetTitle("Window Title".to_string());
let result = sequence.to_string();
let expected = "\x1b]2;Window Title\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_hyperlink_start_with_id() {
let sequence = OscSequence::HyperlinkStart {
uri: "https://example.com".to_string(),
id: Some("link1".to_string()),
};
let result = sequence.to_string();
let expected = "\x1b]8;link1;https://example.com\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_hyperlink_start_without_id() {
let sequence = OscSequence::HyperlinkStart {
uri: "https://example.com".to_string(),
id: None,
};
let result = sequence.to_string();
let expected = "\x1b]8;;https://example.com\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_hyperlink_end() {
let sequence = OscSequence::HyperlinkEnd;
let result = sequence.to_string();
let expected = "\x1b]8;;\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_empty_strings() {
let sequence = OscSequence::SetTitle(String::new());
let result = sequence.to_string();
let expected = "\x1b]2;\x07";
assert_eq!(result, expected);
}
#[test]
fn test_osc_sequence_special_characters() {
let sequence = OscSequence::SetTitle("Title with spaces & symbols!".to_string());
let result = sequence.to_string();
let expected = "\x1b]2;Title with spaces & symbols!\x07";
assert_eq!(result, expected);
}
#[test]
fn test_hyperlink_complete_sequence() {
let start = OscSequence::HyperlinkStart {
uri: "https://r3bl.com".to_string(),
id: Some("r3bl".to_string()),
};
let end = OscSequence::HyperlinkEnd;
let complete_link = format!("{start}Link Text{end}");
let expected = "\x1b]8;r3bl;https://r3bl.com\x07Link Text\x1b]8;;\x07";
assert_eq!(complete_link, expected);
}
}