aboutsummaryrefslogtreecommitdiffstats
path: root/src/widgets/command.rs
diff options
context:
space:
mode:
authorDaniel Jankowski <daniel.jankowski@rub.de>2023-12-25 12:01:22 +0100
committerDaniel Jankowski <daniel.jankowski@rub.de>2023-12-25 12:02:04 +0100
commit336ace1ec9e4de0b372038dba6158c7dc567c833 (patch)
treed52bf36750ab23eb3ee0564a1274315544aad1c1 /src/widgets/command.rs
parentfeat: don't call format_string if the command_xxx_format doesn't contains (#28) (diff)
downloadsl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.tar.gz
sl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.tar.xz
sl0pstatus-336ace1ec9e4de0b372038dba6158c7dc567c833.zip
feat: implement render modes for command widget
resolves #25
Diffstat (limited to 'src/widgets/command.rs')
-rw-r--r--src/widgets/command.rs45
1 files changed, 36 insertions, 9 deletions
diff --git a/src/widgets/command.rs b/src/widgets/command.rs
index e9aebcd..22b2892 100644
--- a/src/widgets/command.rs
+++ b/src/widgets/command.rs
@@ -21,10 +21,18 @@ lazy_static! {
}
#[derive(Clone, Debug)]
+enum RenderMode {
+ Static,
+ Dynamic,
+ Raw,
+}
+
+#[derive(Clone, Debug)]
struct CommandConfig {
command: String,
format: FormattedPart,
interval: i64,
+ render_mode: RenderMode,
}
#[derive(Clone, Debug)]
@@ -93,21 +101,28 @@ impl Widget for CommandWidget {
.unwrap_or(&command_result.stderr),
);
}
- if command_config.format != FormattedPart::default() {
- command_config.format.format_string(&content)
- }
- else{
- return content;
+
+ match command_config.render_mode {
+ RenderMode::Static => command_config.format.format_string(&content),
+ RenderMode::Dynamic => render_dynamic_formatted_content(&content),
+ RenderMode::Raw => content,
}
}
fn process_click(&self, _state: &ZellijState, _pos: usize) {}
}
+fn render_dynamic_formatted_content(content: &str) -> String {
+ FormattedPart::multiple_from_format_string(content)
+ .iter()
+ .map(|fp| fp.format_string(&fp.content))
+ .collect::<Vec<String>>()
+ .join("")
+}
+
fn run_command_if_needed(command_config: CommandConfig, name: &str, state: &ZellijState) {
let ts = Local::now();
- let last_run =
- get_timestamp_from_event_or_default(name, state, command_config.interval);
+ let last_run = get_timestamp_from_event_or_default(name, state, command_config.interval);
if ts.timestamp() - last_run.timestamp() >= command_config.interval {
let mut context = BTreeMap::new();
@@ -141,6 +156,7 @@ fn parse_config(zj_conf: &BTreeMap<String, String>) -> BTreeMap<String, CommandC
command: "".to_owned(),
format: FormattedPart::default(),
interval: 1,
+ render_mode: RenderMode::Static,
};
if let Some(existing_conf) = config.get(command_name.as_str()) {
@@ -152,14 +168,25 @@ fn parse_config(zj_conf: &BTreeMap<String, String>) -> BTreeMap<String, CommandC
}
if key.ends_with("format") {
- command_conf.format =
- FormattedPart::from_format_string(zj_conf.get(&key).unwrap().to_owned().clone());
+ command_conf.format = FormattedPart::from_format_string(zj_conf.get(&key).unwrap());
}
if key.ends_with("interval") {
command_conf.interval = zj_conf.get(&key).unwrap().parse::<i64>().unwrap_or(1);
}
+ if key.ends_with("rendermode") {
+ command_conf.render_mode = match zj_conf.get(&key) {
+ Some(mode) => match mode.as_str() {
+ "static" => RenderMode::Static,
+ "dynamic" => RenderMode::Dynamic,
+ "raw" => RenderMode::Raw,
+ _ => RenderMode::Static,
+ },
+ None => RenderMode::Static,
+ };
+ }
+
config.insert(command_name, command_conf);
}