use std::{
io::Read,
fs::File,
ffi::CString,
};
use nix::{
unistd::Pid,
sys::wait::WaitStatus,
};
use crate::{
program::posix::builtin::Builtin,
program::{Result, Runtime, parse_and_run},
};
pub struct Dot;
impl Builtin for Dot {
fn run(self, argv: Vec<CString>, runtime: &mut Runtime) -> Result<WaitStatus> {
match argv.len() {
0 => unreachable!(),
1 => {
eprintln!("filename argument required");
Ok(WaitStatus::Exited(Pid::this(), 2))
}
2 => {
let path = argv[1].to_str().unwrap();
if let Ok(mut file) = File::open(&path) {
let mut contents = String::new();
if file.read_to_string(&mut contents).is_ok() {
parse_and_run(&contents, runtime)
} else {
Ok(WaitStatus::Exited(Pid::this(), 1))
}
} else {
Ok(WaitStatus::Exited(Pid::this(), 1))
}
},
_ => unreachable!(),
}
}
}