pub struct RunReadEvalLoop(pub for<'a> fn(&'a RefCell<&mut Env>, Config<'a>) -> Pin<Box<dyn Future<Output = Result> + 'a>>);Expand description
Wrapper for running a read-eval-loop
This struct declares a function type for running a read-eval-loop. An
implementation of this function type should be provided and stored in the
environment’s any storage so that it can be used by modules
depending on read-eval-loop execution.
The function takes two arguments. The first argument is a mutable reference
to an environment wrapped in a RefCell. The second argument is a
configuration for the parser, which contains the
input function and source information. The
configuration will be used by the function to create a lexer for reading
commands.
Note that the RefCell is passed as a shared reference. It can be shared
with the input function, allowing the input function to access and modify
the environment while reading commands. The input function must release
the borrow on the RefCell before returning control to the caller so that
the caller can borrow the RefCell mutably to execute commands read from
the parser.
The function returns a future which resolves to a Result when awaited.
The function should execute commands read from the lexer until the end of
input or a Divert is encountered.
The function should set Env::exit_status appropriately after the loop
ends. If the input contains no commands, the exit status should be set to
ExitStatus(0).
The function should also update subshell statuses and handle traps during the loop execution as specified in the shell semantics.
The most standard implementation of this function type is provided in the
yash-semantics crate:
let mut env = yash_env::Env::new_virtual();
env.any.insert(Box::new(RunReadEvalLoop(|env, config| {
Box::pin(async move {
yash_semantics::read_eval_loop(env, &mut config.into()).await
})
})));Tuple Fields§
§0: for<'a> fn(&'a RefCell<&mut Env>, Config<'a>) -> Pin<Box<dyn Future<Output = Result> + 'a>>Trait Implementations§
Source§impl Clone for RunReadEvalLoop
impl Clone for RunReadEvalLoop
Source§fn clone(&self) -> RunReadEvalLoop
fn clone(&self) -> RunReadEvalLoop
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RunReadEvalLoop
impl Debug for RunReadEvalLoop
impl Copy for RunReadEvalLoop
Auto Trait Implementations§
impl Freeze for RunReadEvalLoop
impl RefUnwindSafe for RunReadEvalLoop
impl Send for RunReadEvalLoop
impl Sync for RunReadEvalLoop
impl Unpin for RunReadEvalLoop
impl UnwindSafe for RunReadEvalLoop
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more