use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext}; use crate::script::exec_command; use color_eyre::{Help, Report, Result}; use gtk::prelude::*; use gtk::Label; use serde::Deserialize; use std::process::Stdio; use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::process::Command; use tokio::sync::mpsc::{Receiver, Sender}; use tokio::time::sleep; use tokio::{select, spawn}; use tracing::error; #[derive(Debug, Deserialize, Clone, Copy)] #[serde(rename_all = "kebab-case")] enum Mode { Poll, Watch, } #[derive(Debug, Deserialize, Clone)] pub struct ScriptModule { /// Path to script to execute. path: String, /// Script execution mode #[serde(default = "default_mode")] mode: Mode, /// Time in milliseconds between executions. #[serde(default = "default_interval")] interval: u64, } /// `Mode::Poll` const fn default_mode() -> Mode { Mode::Poll } /// 5000ms const fn default_interval() -> u64 { 5000 } impl Module