cargo_uwu/
lib.rs

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            // not an uwu solution
24            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"; // no way of checking this;
41                                                                     // actually it just prints the help message in that case, so we're fine
42fn 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(); // needs more testing, but whatever
70    }
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    // #[test]
80    // fn invalid_unicode() {}
81}