about summary refs log tree commit diff
path: root/pkgs/profpatsch/execline/run-cmd-line-block.rs
blob: 324ce8585160d51bb2e9f19459de964cf8fde466 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use std::ffi::{OsString, OsStr};
use std::process::{Command};
use std::os::unix::process::CommandExt;

fn main() -> std::io::Result<()> {
  let args = std::env::args_os();
  let mut cmd : Vec<OsString> = vec![];
  let mut depth = 0;
  for arg in args.skip(1) {
    if arg == OsString::from("[") {
        depth = depth + 1;
    } else if arg == OsString::from("]") {
        depth = depth - 1;
        cmd.push(prepend_block_depth(depth, &OsString::from("")));
    } else {
        cmd.push(prepend_block_depth(depth, &arg));
    }
  }

  Err(match cmd.len() {
      0 => std::process::exit(0),
      1 => Command::new(&cmd[0]).exec(),
      _ => Command::new(&cmd[0])
             .args(&cmd[1..])
             .exec()
  })
}

fn prepend_block_depth(depth: usize, arg: &OsStr) -> OsString {
    let mut s = OsString::from(" ".repeat(depth));
    s.push(arg);
    s
}