1use std::process::Command;
2
3fn parse_command_output(stream: Vec<u8>) -> Result<String, String> {
4 match String::from_utf8(stream) {
5 Ok(str) => match uwu_rs::uwuify(str) {
6 Ok(uwu_text) => Ok(uwu_text),
7 Err(err) => Err(err.to_string()),
8 },
9 Err(err) => Err(err.to_string()),
10 }
11}
12
13const STDERR_BEGIN: &str =
14 "Onwy keep :3 weading ^-^ if *boops your nose* you messed ;;w;; up >w<:\n";
15fn run_command(args: impl Iterator<Item = String>) -> Result<String, String> {
16 let mut command = Command::new("cargo");
17 let command_chain = command.arg("--color=always");
18 for arg in args {
19 command_chain.arg(arg);
20 }
21 match command.output() {
22 Ok(streams) => {
23 let err_stream = if streams.stderr.len() > 0 {
25 format!("{STDERR_BEGIN}{}", parse_command_output(streams.stderr)?)
26 } else {
27 String::new()
28 };
29 Ok(format!(
30 "{}\n{}",
31 parse_command_output(streams.stdout)?,
32 err_stream
33 ))
34 }
35 Err(err) => Err(format!("F-failed to execute?! ({err})")),
36 }
37}
38
39const DRY_RUN_ERR_MSG: &str = "Dry Run? *confused >.<*";
40const _EMPTY_ERR_MSG: &str = "UwU, did you just want to see me? :3"; fn parse_commands(mut args: impl Iterator<Item = String>) -> Result<String, String> {
43 args.next();
44 if let None = args.next() {
45 return Err(DRY_RUN_ERR_MSG.to_string());
46 }
47
48 Ok(run_command(args)?)
49}
50
51pub fn init(args: impl Iterator<Item = String>) {
52 match parse_commands(args) {
53 Ok(res) => print!("{res}"),
54 Err(err) => eprint!("{err}"),
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn test_ok() {
64 let vec = vec![
65 "pwogwam".to_string(),
66 "uwu".to_string(),
67 "build".to_string(),
68 ];
69 parse_commands(vec.into_iter()).unwrap(); }
71
72 #[test]
73 fn test_dry_run() {
74 let vec = vec!["pwogwam".to_string()];
75 let res = parse_commands(vec.into_iter());
76 assert_eq!(res, Err(DRY_RUN_ERR_MSG.to_string()));
77 }
78
79 }