use super::{OscEvent, osc_codes::OscSequence};
use crate::{core::terminal_io::OutputDevice, lock_output_device_as_mut};
use miette::IntoDiagnostic;
pub struct OscController<'a> {
output_device: &'a OutputDevice,
}
impl std::fmt::Debug for OscController<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("OscController")
.field("output_device", &"<OutputDevice>")
.finish()
}
}
impl<'a> OscController<'a> {
#[must_use]
pub fn new(output_device: &'a OutputDevice) -> Self { Self { output_device } }
pub fn set_title_and_tab(&mut self, text: &str) -> miette::Result<()> {
let sequence = OscSequence::SetTitleAndIcon(text.to_string());
self.write_sequence(&sequence.to_string())
}
pub fn send_event(&mut self, event: OscEvent) -> miette::Result<()> {
match event {
OscEvent::SetTitleAndTab(text) => self.set_title_and_tab(&text),
_ => Ok(()), }
}
fn write_sequence(&mut self, sequence: &str) -> miette::Result<()> {
write!(lock_output_device_as_mut!(self.output_device), "{sequence}")
.into_diagnostic()?;
Ok(())
}
}