From 0548e74cb3227716cf445f27bd64b8c0b4d0f981 Mon Sep 17 00:00:00 2001 From: Rory Dudley Date: Mon, 26 Feb 2024 23:14:13 -0700 Subject: Cleanup recite(), custom errors, fixed forking First off, moved the giant match statements out of recite(), and into macros in src/recite/ps.rs. There still needs to be two, since any verse using the 'couplet' meter will need to redirect its STDOUT. Now the recite() function returns a Result<(), Mishap>, which can be invoked when calling the incant_ functions. Custom errors were added in the form of 'Mishap''s. They are intended to be returned from the incant_ functions, in the event that something goes wrong with the Command::spawn() or Child::wait(). They each take a String, which should be the verb or stanza that was entered by the user. The incant_ functions separate the functionality of each type of meter from the recite() function. They return a Result, where i32 is the exit code of the program that ran, and Mishap is a possible error. Before, the shell was cheating at forking a process to the background. It would actually spawn a thread to wait for that process to finish. Now, the program simply registers a handler for SIGCHLD, and uses libc's waitpid() function to reap the child process, and print some output to the user, indicating that it's finished. --- src/recite/erro.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/recite/erro.rs (limited to 'src/recite/erro.rs') diff --git a/src/recite/erro.rs b/src/recite/erro.rs new file mode 100644 index 0000000..00f57b3 --- /dev/null +++ b/src/recite/erro.rs @@ -0,0 +1,15 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum Mishap { + #[error("broken pipe: {0}")] + BrokenPipe(String), + // #[error("exec format error: {0}")] + // ExecFormat(String), + #[error("permission denied: {0}")] + PermissionDenied(String), + #[error("terminated: {0}")] + Terminated(String), + #[error("exec error: {0}")] + Else(String), +} -- cgit v1.2.3