mod ansi;
pub mod highlighting;
mod size;
mod iterm2;
mod kitty;
mod osc;
mod terminology;
pub use self::ansi::AnsiStyle;
pub use self::size::TerminalSize;
#[derive(Debug, Copy, Clone)]
pub enum StyleCapability {
Ansi(AnsiStyle),
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum LinkCapability {
OSC8(self::osc::OSC8Links),
}
#[derive(Debug, Copy, Clone)]
pub enum MarkCapability {
ITerm2(self::iterm2::ITerm2Marks),
}
#[derive(Debug, Copy, Clone)]
pub enum ImageCapability {
Terminology(self::terminology::TerminologyImages),
ITerm2(self::iterm2::ITerm2Images),
Kitty(self::kitty::KittyImages),
}
#[derive(Debug)]
pub struct TerminalCapabilities {
pub name: String,
pub style: Option<StyleCapability>,
pub links: Option<LinkCapability>,
pub image: Option<ImageCapability>,
pub marks: Option<MarkCapability>,
}
fn get_vte_version() -> Option<(u8, u8)> {
std::env::var("VTE_VERSION").ok().and_then(|value| {
value[..2]
.parse::<u8>()
.into_iter()
.zip(value[2..4].parse::<u8>())
.next()
})
}
impl TerminalCapabilities {
pub fn none() -> TerminalCapabilities {
TerminalCapabilities {
name: "dumb".to_string(),
style: None,
links: None,
image: None,
marks: None,
}
}
pub fn ansi() -> TerminalCapabilities {
TerminalCapabilities {
name: "Ansi".to_string(),
style: Some(StyleCapability::Ansi(AnsiStyle)),
links: None,
image: None,
marks: None,
}
}
pub fn iterm2() -> TerminalCapabilities {
TerminalCapabilities {
name: "iTerm2".to_string(),
style: Some(StyleCapability::Ansi(AnsiStyle)),
links: Some(LinkCapability::OSC8(self::osc::OSC8Links)),
image: Some(ImageCapability::ITerm2(self::iterm2::ITerm2Images)),
marks: Some(MarkCapability::ITerm2(self::iterm2::ITerm2Marks)),
}
}
pub fn terminology() -> TerminalCapabilities {
TerminalCapabilities {
name: "Terminology".to_string(),
style: Some(StyleCapability::Ansi(AnsiStyle)),
links: Some(LinkCapability::OSC8(self::osc::OSC8Links)),
image: Some(ImageCapability::Terminology(
self::terminology::TerminologyImages,
)),
marks: None,
}
}
pub fn kitty() -> TerminalCapabilities {
TerminalCapabilities {
name: "Kitty".to_string(),
style: Some(StyleCapability::Ansi(AnsiStyle)),
links: Some(LinkCapability::OSC8(self::osc::OSC8Links)),
image: Some(ImageCapability::Kitty(self::kitty::KittyImages)),
marks: None,
}
}
pub fn vte50() -> TerminalCapabilities {
TerminalCapabilities {
name: "VTE 50".to_string(),
style: Some(StyleCapability::Ansi(AnsiStyle)),
links: Some(LinkCapability::OSC8(self::osc::OSC8Links)),
image: None,
marks: None,
}
}
pub fn detect() -> TerminalCapabilities {
if self::iterm2::is_iterm2() {
Self::iterm2()
} else if self::terminology::is_terminology() {
Self::terminology()
} else if self::kitty::is_kitty() {
Self::kitty()
} else if get_vte_version().filter(|&v| v >= (50, 0)).is_some() {
Self::vte50()
} else {
Self::ansi()
}
}
}