use std::{borrow::Cow, process::Command};
#[derive(Default)]
pub struct OptionsBuilder<'a> {
inner: Options<'a>,
}
impl<'a> OptionsBuilder<'a> {
pub fn tty_name(mut self, tty_name: &'a str) -> Self {
self.inner.tty_name = Some(tty_name);
self
}
pub fn tty_type(mut self, tty_type: &'a str) -> Self {
self.inner.tty_type = Some(tty_type);
self
}
pub fn x11_display(mut self, x11_display: &'a str) -> Self {
self.inner.x11_display = Some(x11_display);
self
}
pub fn wayland_display(mut self, wayland_display: &'a str) -> Self {
self.inner.wayland_display = Some(wayland_display);
self
}
pub fn build(self) -> Options<'a> {
self.inner
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct Options<'a> {
tty_name: Option<&'a str>,
tty_type: Option<&'a str>,
x11_display: Option<&'a str>,
wayland_display: Option<&'a str>,
}
impl<'a> Options<'a> {
pub fn builder() -> OptionsBuilder<'a> {
OptionsBuilder::default()
}
pub(crate) fn tty_name(&self) -> &str {
self.tty_name.unwrap_or("/dev/tty")
}
pub(crate) fn tty_type(&self) -> Cow<'a, str> {
match self.tty_type {
Some(ty) => Cow::Borrowed(ty),
None => std::env::var("TERM")
.map(Cow::Owned)
.unwrap_or(Cow::Borrowed("xterm-256color")),
}
}
pub(crate) fn set_x11_display(&self, command: &mut Command) {
if let Some(x11_display) = self.x11_display {
if x11_display.is_empty() {
command.env_remove("DISPLAY");
} else {
command.env("DISPLAY", x11_display);
}
}
}
pub(crate) fn set_wayland_display(&self, command: &mut Command) {
if let Some(wayland_display) = self.wayland_display {
if wayland_display.is_empty() {
command.env_remove("WAYLAND_DISPLAY");
} else {
command.env("WAYLAND_DISPLAY", wayland_display);
}
}
}
}