summaryrefslogtreecommitdiffstats
path: root/src/poem/anthology/which.rs
blob: 515b52e2289d728b4c87fbdba69bdbb58214b02f (plain)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::compose::Environment;
use crate::poem::Verse;

pub fn incant(verse: &Verse, out: &mut Vec<u8>, env: &Environment) -> i32 {
    let mut status = 0;
    match verse.clause() {
        Some(clause) => {
            let mut output: String;
            for word in clause {
                // Check if it's an alias
                if env.aliases.contains_key(&word) {
                    output = format!("{}: aliased to {}\n", word, env.aliases.get(&word).unwrap());
                    if verse.couplet > 0 {
                        out.append(&mut output.as_bytes().to_vec());
                    } else {
                        print!("{}", output);
                    }
                    continue;
                }

                // Check if it's a built-in
                match super::lookup(&word) {
                    Some(_) => {
                        output = format!("{}: shell built-in command\n", word);
                        if verse.couplet > 0 {
                            out.append(&mut output.as_bytes().to_vec());
                        } else {
                            print!("{}", output);
                        }
                        continue;
                    }
                    None => {}
                }

                // Manually check the path
                let mut verb = Verse::new();
                verb.push(word.clone());
                match verb.spellcheck(&env.bins) {
                    Some(i) => {
                        output = format!("{}\n", env.bins[i]);
                        if verse.couplet > 0 {
                            out.append(&mut output.as_bytes().to_vec());
                        } else {
                            print!("{}", output);
                        }
                    }
                    None => {
                        output = format!("{} not found\n", word);
                        status = 1;
                        eprint!("{}", output);
                    }
                }
            }
        }
        None => {
            eprintln!("which: not enough arguments");
            return 1;
        }
    }
    status
}