use std::{
env, fmt,
path::Path,
ffi::OsStr,
process::{Child, Command}
};
use std::process::Stdio;
pub struct CommandOutput {
pub output: String,
pub success: bool,
pub code: u32
}
pub fn run_command<A: IntoIterator<Item = S> + Clone, S: AsRef<OsStr>>(prog: &str, superuser: bool, args: A) -> CommandOutput {
let mut cmd = if superuser {
let mut cmd_t = Command::new("sudo");
cmd_t.arg(prog);
cmd_t
}
else { Command::new(prog) };
cmd.args(args);
let output = match cmd.output() {
Ok(o) => o,
Err(why) => {
return CommandOutput {
output: why.to_string(),
success: false,
code: 666
};
}
};
let success = output.status.success();
let mut o_fmt = if success { String::from_utf8(output.stdout).unwrap() } else { String::from_utf8(output.stderr).unwrap() };
o_fmt.pop();
CommandOutput {
output: o_fmt,
success,
code: output.status.code().unwrap_or(1) as u32
}
}
pub fn spawn_process<A: IntoIterator<Item = S> + Clone, S: AsRef<OsStr>>(prog: &str, superuser: bool, shout_output: bool, args: A) -> Child {
let mut cmd = if superuser {
let mut cmd_t = Command::new("sudo");
cmd_t.arg(prog);
cmd_t
}
else {
Command::new(prog)
};
if !shout_output {
cmd.stdout(Stdio::null());
cmd.stderr(Stdio::null());
}
cmd.args(args);
cmd.spawn().unwrap()
}
pub fn alphabetize<L: fmt::Display>(list: &[L]) -> Vec<String> {
let mut string_list: Vec<String> = list.iter().map(|s| s.to_string()).collect();
string_list.sort_unstable_by_key(|a| a.to_lowercase());
string_list
}
pub fn get_filename<D: Into<String>>(dir: D) -> String {
let dir_t = dir.into();
let dir_vec = dir_t.split('/');
dir_vec.last().unwrap().to_string()
}
pub fn get_parent<D: Into<String>>(dir: D) -> String {
let dir_t = dir.into();
let mut dir_vec: Vec<&str> = dir_t.split('/').collect();
dir_vec.pop();
dir_vec.pop();
let mut new_dir= String::from("");
for (_, folder) in dir_vec.iter().enumerate(){
for c in folder.chars(){
new_dir.push(c);
}
new_dir.push('/');
}
new_dir
}
pub fn capitalize<W: fmt::Display>(word: W) -> String {
let s1 = word.to_string();
let mut v: Vec<char> = s1.chars().collect();
for item in &mut v {
if item.is_ascii_alphanumeric() {
*item = item.to_ascii_uppercase();
break;
}
}
let s2: String = v.into_iter().collect();
s2
}
pub fn get_execname() -> String {
env::args().next()
.as_ref()
.map(Path::new)
.and_then(Path::file_name)
.and_then(OsStr::to_str)
.map(String::from).unwrap()
}