use crate::{Address, Result, process::run};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Ibus;
impl Ibus {
#[must_use]
pub fn new() -> Self {
Self
}
pub(super) async fn bus_address(&self) -> Result<Address> {
let output = run("ibus", ["address"])
.await
.map_err(|e| crate::Error::Address(format!("Failed to execute ibus command: {e}")))?;
if !output.status.success() {
return Err(crate::Error::Address(format!(
"ibus terminated with code: {}",
output.status
)));
}
let addr = String::from_utf8(output.stdout).map_err(|e| {
crate::Error::Address(format!("Unable to parse ibus output as UTF-8: {e}"))
})?;
addr.trim().parse()
}
pub(super) fn from_options(_opts: std::collections::HashMap<&str, &str>) -> Result<Self> {
Ok(Self)
}
}
impl Default for Ibus {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for Ibus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ibus:")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ibus_new() {
let ibus = Ibus::new();
assert_eq!(ibus.to_string(), "ibus:");
}
#[test]
fn test_ibus_default() {
let ibus = Ibus::default();
assert_eq!(ibus.to_string(), "ibus:");
}
#[test]
fn test_ibus_from_options() {
let options = std::collections::HashMap::new();
let ibus = Ibus::from_options(options).unwrap();
assert_eq!(ibus, Ibus::new());
}
#[test]
fn test_ibus_display() {
let ibus = Ibus::new();
assert_eq!(format!("{}", ibus), "ibus:");
}
}