mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-07-04 12:11:03 +02:00
feat: logging support and proper error handling
This commit is contained in:
parent
917838c98c
commit
ab8f7ecfc8
28 changed files with 1056 additions and 388 deletions
|
@ -1,3 +1,5 @@
|
|||
use color_eyre::{Report, Result};
|
||||
use ksway::{Error, IpcCommand, IpcEvent};
|
||||
use serde::Deserialize;
|
||||
|
||||
pub mod node;
|
||||
|
@ -40,10 +42,68 @@ pub struct SwayNode {
|
|||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct WindowProperties {
|
||||
pub class: String,
|
||||
pub class: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct SwayOutput {
|
||||
pub name: String,
|
||||
}
|
||||
|
||||
pub struct SwayClient {
|
||||
client: ksway::Client,
|
||||
}
|
||||
|
||||
impl SwayClient {
|
||||
pub(crate) fn run(&mut self, cmd: String) -> Result<Vec<u8>> {
|
||||
match self.client.run(cmd) {
|
||||
Ok(res) => Ok(res),
|
||||
Err(err) => Err(get_client_error(err)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SwayClient {
|
||||
pub fn connect() -> Result<Self> {
|
||||
let client = match ksway::Client::connect() {
|
||||
Ok(client) => Ok(client),
|
||||
Err(err) => Err(get_client_error(err)),
|
||||
}?;
|
||||
|
||||
Ok(Self { client })
|
||||
}
|
||||
|
||||
pub fn ipc(&mut self, command: IpcCommand) -> Result<Vec<u8>> {
|
||||
match self.client.ipc(command) {
|
||||
Ok(res) => Ok(res),
|
||||
Err(err) => Err(get_client_error(err)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn subscribe(
|
||||
&mut self,
|
||||
event_types: Vec<IpcEvent>,
|
||||
) -> Result<crossbeam_channel::Receiver<(IpcEvent, Vec<u8>)>> {
|
||||
match self.client.subscribe(event_types) {
|
||||
Ok(res) => Ok(res),
|
||||
Err(err) => Err(get_client_error(err)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn poll(&mut self) -> Result<()> {
|
||||
match self.client.poll() {
|
||||
Ok(()) => Ok(()),
|
||||
Err(err) => Err(get_client_error(err)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets an error report from a `ksway` error enum variant
|
||||
pub fn get_client_error(error: Error) -> Report {
|
||||
match error {
|
||||
Error::SockPathNotFound => Report::msg("Sway socket path not found"),
|
||||
Error::SubscriptionError => Report::msg("Sway IPC subscription error"),
|
||||
Error::AlreadySubscribed => Report::msg("Already subscribed to Sway IPC server"),
|
||||
Error::Io(err) => Report::new(err),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
use crate::sway::SwayNode;
|
||||
use ksway::{Client, IpcCommand};
|
||||
use crate::sway::{SwayClient, SwayNode};
|
||||
use color_eyre::Result;
|
||||
use ksway::IpcCommand;
|
||||
|
||||
impl SwayNode {
|
||||
pub fn get_id(&self) -> &str {
|
||||
self.app_id.as_ref().map_or_else(
|
||||
|| {
|
||||
&self
|
||||
.window_properties
|
||||
self.window_properties
|
||||
.as_ref()
|
||||
.expect("cannot find node name")
|
||||
.expect("Cannot find node window properties")
|
||||
.class
|
||||
.as_ref()
|
||||
.expect("Cannot find node name")
|
||||
},
|
||||
|app_id| app_id,
|
||||
)
|
||||
|
@ -34,12 +36,14 @@ fn check_node(node: SwayNode, window_nodes: &mut Vec<SwayNode>) {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_open_windows(sway: &mut Client) -> Vec<SwayNode> {
|
||||
let raw = sway.ipc(IpcCommand::GetTree).unwrap();
|
||||
let root_node = serde_json::from_slice::<SwayNode>(&raw).unwrap();
|
||||
impl SwayClient {
|
||||
pub fn get_open_windows(&mut self) -> Result<Vec<SwayNode>> {
|
||||
let root_node = self.ipc(IpcCommand::GetTree)?;
|
||||
let root_node = serde_json::from_slice(&root_node)?;
|
||||
|
||||
let mut window_nodes = vec![];
|
||||
check_node(root_node, &mut window_nodes);
|
||||
let mut window_nodes = vec![];
|
||||
check_node(root_node, &mut window_nodes);
|
||||
|
||||
window_nodes
|
||||
Ok(window_nodes)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue