use std::process::Command;
use crate::{
Address, Result,
runtime::{Runtime, process},
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Ibus;
impl Ibus {
#[must_use]
pub fn new() -> Self {
Self
}
pub(super) async fn bus_address(&self, runtime: &Runtime) -> Result<Address> {
let mut command = Command::new("ibus");
command.arg("address");
let printed = process::stdout(runtime, command)
.await
.map_err(|e| crate::Error::Address(format!("The ibus command failed: {e}")))?;
let addr = String::from_utf8(printed).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::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:");
}
}