summaryrefslogtreecommitdiffstats
path: root/src/main.rs
blob: 31133da6a65d74c25a2c66f74f8a5a04eb88eea7 (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
use std::io::{self,stdin,stdout,Write};
use std::str::FromStr;
use std::process::{Command};
use std::env;
use std::path::Path;

fn substitute_vars(word: &str) -> String {
	match word {
		"~" => env::var("HOME").unwrap(),
		w if w.chars().nth(0) == Some('$') => String::from_str(w).unwrap(),
		w => String::from_str(w).unwrap()
	}
}

fn main() -> io::Result<()> {
	loop {
		stdout().write_all(b"> ")?;
		stdout().flush()?;
		
		let mut line = String::new();
		stdin().read_line(&mut line).unwrap();

		let mut parts = line.trim().split_whitespace();
		let command = parts.next().unwrap();
		
		match command {
			"exit" => return Ok(()),
			"cd" => {
				// change directory
				match parts.next() {
					None => {
						let home = env::var("HOME").unwrap();
						let cd = Path::new(home.as_str());
						env::set_current_dir(&cd)?;							
					},
					Some(p) => {
						let tmp = substitute_vars(p);
						let cd = Path::new(&tmp);
						env::set_current_dir(&cd)?;
					}
				};
			},
			command => {
				let child = Command::new(command)
					.args(parts.map(substitute_vars))
					.spawn();

				match child {
					Ok(mut child) => { child.wait()?; },
					Err(e) => eprintln!("{}", e)
				}
			}
		}
	}
}