From 1181ac9beba26e9f950ddadee8ef2c7ab5495f17 Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Sun, 15 Sep 2019 15:05:41 +0200 Subject: [PATCH] Add script extension --- src/extension/mod.rs | 2 ++ src/extension/script.rs | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/extension/script.rs diff --git a/src/extension/mod.rs b/src/extension/mod.rs index 139dea2..87fac7c 100644 --- a/src/extension/mod.rs +++ b/src/extension/mod.rs @@ -2,6 +2,7 @@ use serde_yaml::Mapping; mod date; mod shell; +mod script; pub trait Extension { fn name(&self) -> String; @@ -12,5 +13,6 @@ pub fn get_extensions() -> Vec> { vec![ Box::new(date::DateExtension::new()), Box::new(shell::ShellExtension::new()), + Box::new(script::ScriptExtension::new()), ] } \ No newline at end of file diff --git a/src/extension/script.rs b/src/extension/script.rs new file mode 100644 index 0000000..fcb5b5b --- /dev/null +++ b/src/extension/script.rs @@ -0,0 +1,55 @@ +use serde_yaml::{Mapping, Value}; +use std::process::Command; +use log::{warn, error}; + +pub struct ScriptExtension {} + +impl ScriptExtension { + pub fn new() -> ScriptExtension { + ScriptExtension{} + } +} + +impl super::Extension for ScriptExtension { + fn name(&self) -> String { + String::from("script") + } + + fn calculate(&self, params: &Mapping) -> Option { + let args = params.get(&Value::from("args")); + if args.is_none() { + warn!("No 'args' parameter specified for script variable"); + return None + } + let args = args.unwrap().as_sequence(); + if let Some(args) = args { + let str_args = args.iter().map(|arg| { + arg.as_str().unwrap_or_default().to_string() + }).collect::>(); + + let output = if str_args.len() > 1 { + Command::new(&str_args[0]) + .args(&str_args[1..]) + .output() + }else{ + Command::new(&str_args[0]) + .output() + }; + + match output { + Ok(output) => { + let output_str = String::from_utf8_lossy(output.stdout.as_slice()); + + return Some(output_str.into_owned()) + }, + Err(e) => { + error!("Could not execute script '{:?}', error: {}", args, e); + return None + }, + } + } + + error!("Could not execute script with args '{:?}'", args); + None + } +} \ No newline at end of file