movin stuff into a shell module
parent
37224f63c5
commit
891ed46af9
@ -0,0 +1,117 @@
|
|||||||
|
use std::fs::File;
|
||||||
|
use std::io::{Read, Seek, SeekFrom, Write};
|
||||||
|
use crate::output;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
pub fn eval(output: &mut output::Writer, cmd: String, args: Vec<&str>) -> Result<bool> {
|
||||||
|
match cmd.as_str() {
|
||||||
|
"pwd" => {
|
||||||
|
let pb = std::env::current_dir()?;
|
||||||
|
println!("{}", pb.as_path().as_os_str().to_str().unwrap());
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
"cd" => {
|
||||||
|
let cwd = std::env::current_dir()?;
|
||||||
|
if args.len() > 0 {
|
||||||
|
let target = cwd.join(args[0]);
|
||||||
|
std::env::set_current_dir(target)?;
|
||||||
|
}
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
"printenv" => {
|
||||||
|
if args.len() > 0 {
|
||||||
|
let name = args[0];
|
||||||
|
match std::env::var(name) {
|
||||||
|
Ok(val) => {
|
||||||
|
println!("{}", val);
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("ERROR {}", e);
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println!("which variable you fucking dork");
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"which" => {
|
||||||
|
if args.len() > 0 {
|
||||||
|
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(args[0]).with_extension("exe");
|
||||||
|
if fname.exists() && fname.is_file() {
|
||||||
|
println!("{}", fname.to_str().unwrap());
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("not found: {}", args[0]);
|
||||||
|
return Ok(false);
|
||||||
|
} else {
|
||||||
|
println!("what do you want to look for?");
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"tail" => {
|
||||||
|
if args.len() > 0 {
|
||||||
|
let fname = args[0];
|
||||||
|
match File::options().read(true).open(fname) {
|
||||||
|
Ok(mut f) => {
|
||||||
|
_ = f.seek(SeekFrom::End(0));
|
||||||
|
let mut one_byte: [u8; 1] = [0; 1];
|
||||||
|
let mut buf: Vec<u8> = vec![];
|
||||||
|
loop {
|
||||||
|
match f.read(&mut one_byte) {
|
||||||
|
Ok(n) => {
|
||||||
|
if n == 1 {
|
||||||
|
buf.push(one_byte[0]);
|
||||||
|
if let Ok(s) = std::str::from_utf8(&buf) {
|
||||||
|
output.write(s.as_bytes())?;
|
||||||
|
buf.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("failed to open file: {}", e);
|
||||||
|
return Err(e.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println!("need a file name");
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"echo" => {
|
||||||
|
println!("{}", args.join(" "));
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
let mut proc = std::process::Command::new(cmd);
|
||||||
|
if args.len() > 0 {
|
||||||
|
proc.args(args);
|
||||||
|
}
|
||||||
|
match proc.spawn() {
|
||||||
|
Ok(mut child) => {
|
||||||
|
if let Err(e) = child.wait() {
|
||||||
|
println!("error: {}", e);
|
||||||
|
return Err(e.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("error: {}", e);
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue