RunReadEvalLoop

Struct RunReadEvalLoop 

Source
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

Source§

fn clone(&self) -> RunReadEvalLoop

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RunReadEvalLoop

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Copy for RunReadEvalLoop

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.