diff --git a/src/main.rs b/src/main.rs index f3ad436..fbdce52 100644 --- a/src/main.rs +++ b/src/main.rs @@ -142,12 +142,66 @@ fn newline(stdout: HANDLE) -> Result<()> { } fn eval(line: String) -> Result<()> { - if line == "pwd" { - let pb = std::env::current_dir()?; - println!("{}", pb.as_path().as_os_str().to_str().unwrap()); + let parts: Vec<&str> = line.split_whitespace().collect(); + if parts.len() == 0 { return Ok(()); } - println!("{}", line); + + let cmd = parts[0]; + match cmd { + "pwd" => { + let pb = std::env::current_dir()?; + println!("{}", pb.as_path().as_os_str().to_str().unwrap()); + return Ok(()); + } + "printenv" => { + if parts.len() > 1 { + let name = parts[1]; + match std::env::var(name) { + Ok(val) => println!("{}", val), + Err(e) => println!("ERROR {}", e), + } + } else { + println!("which variable you fucking dork"); + } + return Ok(()); + } + "which" => { + if parts.len() > 1 { + let path = std::env::var("path").unwrap(); + let dirs: Vec<&str> = path.split(";").collect(); + for d in dirs { + let dir = std::path::Path::new(d); + let fname = dir.join(parts[1]).with_extension("exe"); + if fname.exists() && fname.is_file() { + println!("{}", fname.to_str().unwrap()); + return Ok(()); + } + } + println!("not found: {}", parts[1]); + return Ok(()); + } + } + "echo" => { + let rest: Vec<&str> = parts[1..].to_vec(); + println!("{:?}", rest); + } + _ => { + let mut proc = std::process::Command::new(cmd); + match proc.spawn() { + Ok(mut child) => { + if let Err(e) = child.wait() { + println!("error: {}", e) + } + } + Err(e) => { + println!("error: {}", e) + } + } + return Ok(()); + } + } + // println!("Error: no such command: {}", cmd); Ok(()) }