use crate::config::CommonConfig; use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext}; use crate::script::{OutputStream, Script, ScriptMode}; use crate::try_send; use color_eyre::{Help, Report, Result}; use gtk::prelude::*; use gtk::Label; use serde::Deserialize; use tokio::spawn; use tokio::sync::mpsc::{Receiver, Sender}; use tracing::error; #[derive(Debug, Deserialize, Clone)] pub struct ScriptModule { /// Path to script to execute. cmd: String, /// Script execution mode #[serde(default = "default_mode")] mode: ScriptMode, /// Time in milliseconds between executions. #[serde(default = "default_interval")] interval: u64, #[serde(flatten)] pub common: Option, } /// `Mode::Poll` const fn default_mode() -> ScriptMode { ScriptMode::Poll } /// 5000ms const fn default_interval() -> u64 { 5000 } impl From<&ScriptModule> for Script { fn from(module: &ScriptModule) -> Self { Self { mode: module.mode, cmd: module.cmd.clone(), interval: module.interval, } } } impl Module