use crate::config::CommonConfig; use crate::gtk_helpers::IronbarLabelExt; use crate::modules::{Module, ModuleInfo, ModuleParts, ModuleUpdateEvent, WidgetContext}; use crate::script::{OutputStream, Script, ScriptMode}; use crate::{glib_recv, module_impl, spawn, try_send}; use color_eyre::{Help, Report, Result}; use gtk::prelude::*; use gtk::Label; use serde::Deserialize; use tokio::sync::mpsc; use tracing::error; #[derive(Debug, Deserialize, Clone)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] pub struct ScriptModule { /// Path to script to execute. /// /// This can be an absolute path, /// or relative to the working directory. /// /// **Required** cmd: String, /// Script execution mode. /// See [modes](#modes) for more info. /// /// **Valid options**: `poll`, `watch` ///
/// **Default**: `poll` #[serde(default = "default_mode")] mode: ScriptMode, /// Time in milliseconds between executions. /// /// **Default**: `5000` #[serde(default = "default_interval")] interval: u64, /// See [common options](module-level-options#common-options). #[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