about summary refs log tree commit diff stats
path: root/pkgs/by-name/no/notify-run/src
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/no/notify-run/src')
-rw-r--r--pkgs/by-name/no/notify-run/src/main.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/pkgs/by-name/no/notify-run/src/main.rs b/pkgs/by-name/no/notify-run/src/main.rs
new file mode 100644
index 00000000..a6a0165a
--- /dev/null
+++ b/pkgs/by-name/no/notify-run/src/main.rs
@@ -0,0 +1,65 @@
+// nixos-config - My current NixOS configuration
+//
+// Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of my nixos-config.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+use std::{env::args, path::PathBuf, process::Command};
+
+use anyhow::{Context, Result};
+
+fn main() -> Result<()> {
+    let args = args().skip(1).collect::<Vec<_>>();
+
+    let mut cmd = Command::new(&args[0]);
+    if let Some(arguments) = args.get(1) {
+        cmd.args(arguments.split(" ").collect::<Vec<_>>().as_slice());
+    }
+
+    eprintln!("Spawning {:?}", cmd);
+
+    let output = cmd
+        .output()
+        .with_context(|| format!("Failed to spawn and await output of {:?}", cmd))?;
+
+    if !output.status.success() {
+        let mut notify_send = Command::new("notify-send");
+        notify_send.args([
+            format!("Command {:?} failed", cmd).as_str(),
+            &String::from_utf8_lossy(output.stderr.as_slice()),
+        ]);
+
+        notify_send.status().with_context(|| {
+            format!(
+                "Failed to run `notify-send` to tell about failed command ({:?}).",
+                cmd
+            )
+        })?;
+    } else {
+        let name = PathBuf::from(&args[0])
+            .file_name()
+            .expect("this to be a command, and thus have a file_name")
+            .to_string_lossy()
+            .to_string();
+
+        print!("{}", append_name(&name, &output.stdout));
+        eprint!("{}", append_name(&name, &output.stderr));
+    }
+
+    Ok(())
+}
+
+fn append_name(name: &str, base: &[u8]) -> String {
+    let base = String::from_utf8_lossy(base).to_string();
+
+    let mut output = String::new();
+    for line in base.lines() {
+        output.push_str(format!("{name}> {line}\n").as_str());
+    }
+
+    output
+}