summaryrefslogtreecommitdiffstats
path: root/src/compose
Commit message (Collapse)AuthorAgeFilesLines
* Fix capturing output for internal poemsRory Dudley2024-06-211-0/+3
| | | | | | | | | | Sometime when the switch to the new built-in command system was happening, we lost the logic to force the capture the output of STDOUT, mainly used for running internal poems (i.e. 'ls `ls`'). This patch adds a new field to the Environment struct, called fc (force capture). It gets set to true before running internal poems, and unset afterwards. Finally, some checks were added to the incant!() macro to properly handle STDOUT when fc is set.
* Updated the way built-in commands are called/usedRory Dudley2024-06-041-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, built-in commands were fairly primitive, merely outputting STDOUT and STDERR with the print! macros. However, we need them to behave like normal programs, that is: - Acknowledge their verse's meter (forking, piping, etc.), - Ability to capture STDOUT and STDERR (>, 2>), - and Affect the currently running environment. For these reasons, the anthology was reworked, and now contains the Anthology struct, which mimics both std::process::{Child, Command}. The AnthologyStdin helper struct was also created, for built-ins to take input on STDIN, though no built-in is currently using it. Each built-ins' incant functions were updated to return a std::process::Output. It contains output from STDOUT, output from STDERR, and the exit code of the "process". A fix was also implemented for aliases, where the STDOUT and STDERR vectors were not being copied to the newly constructed verse. Notes: There is some cleanup that needs to happen on this patch. For one, the spellcheck function is no longer being used, so there is a generic OS error if the program cannot be found in the $PATH. Also, anthology::lookup gets called twice, which shouldn't need to happen.
* Add doc comments for the Environment structRory Dudley2024-05-201-0/+25
| | | | | Added documentation comments for the Environment struct, which includes uses cases, and defining the fields.
* Allow aliases with the same name as their verbRory Dudley2024-05-201-0/+2
| | | | | | | | | | | | | | | | | Previously, when trying to add an alias that used the same name as its command, an infinite recursion loop would occur, and the program would panic after the call stack got too deep. For instance, something like: alias grep='grep --color=always' would cause it to panic. This patch adds a new field to the Environment struct called 'cs' (for call stack), which can be used to keep track of how many levels deep into the Poem::read() function we are in. At the moment, it only allows going two levels deep, but since it's just a u8 value, this could be increased in the future. The above example now works correctly, but it does mean that aliases within aliases are not possible, currently.
* Add the 'alias' built-in commandRory Dudley2024-03-301-3/+5
| | | | | | | | | | | The shell now has support for aliases (via alias foo=bar). The 'unalias' command is also available to remove aliases. Finally, Environment::aliases was changed to be a HashMap<String, String>, instead of a Vec<String>. Since the verse's verb might change (for instance, it is an environment variable, or an alias), add another check in Poem::recite, which simply continues, instead of running the spellchecker, if the verb is empty.
* Add wrapper for global shell environmentRory Dudley2024-03-301-0/+13
Instead of having to pass around a bunch of different data structures for various shell functions, create the wrapper compose::Environment, which serves as a global shell state. It is configured via login/profile/rc scripts initially, but can of course be modified throughout the lifetime of the shell.