Struct Thread

Source
pub struct Thread<'lua>(/* private fields */);
Expand description

Handle to an internal Lua thread (or coroutine).

Implementations§

Source§

impl<'lua> Thread<'lua>

Source

pub fn resume<A, R>(&self, args: A) -> Result<R>
where A: ToLuaMulti<'lua>, R: FromLuaMulti<'lua>,

Resumes execution of this thread.

Equivalent to coroutine.resume.

Passes args as arguments to the thread. If the coroutine has called coroutine.yield, it will return these arguments. Otherwise, the coroutine wasn’t yet started, so the arguments are passed to its main function.

If the thread is no longer in Active state (meaning it has finished execution or encountered an error), this will return Err(CoroutineInactive), otherwise will return Ok as follows:

If the thread calls coroutine.yield, returns the values passed to yield. If the thread returns values from its main function, returns those.

§Examples
let thread: Thread = lua.load(r#"
    coroutine.create(function(arg)
        assert(arg == 42)
        local yieldarg = coroutine.yield(123)
        assert(yieldarg == 43)
        return 987
    end)
"#).eval()?;

assert_eq!(thread.resume::<_, u32>(42)?, 123);
assert_eq!(thread.resume::<_, u32>(43)?, 987);

// The coroutine has now returned, so `resume` will fail
match thread.resume::<_, u32>(()) {
    Err(Error::CoroutineInactive) => {},
    unexpected => panic!("unexpected result {:?}", unexpected),
}
Source

pub fn into_async<A, R>(self, args: A) -> AsyncThread<'lua, R>
where A: ToLuaMulti<'lua>, R: FromLuaMulti<'lua>,

Available on crate feature async only.

Converts Thread to an AsyncThread which implements Future and Stream traits.

args are passed as arguments to the thread function for first call. The object calls resume() while polling and also allows to run rust futures to completion using an executor.

Using AsyncThread as a Stream allows to iterate through coroutine.yield() values whereas Future version discards that values and poll until the final one (returned from the thread function).

Requires feature = "async"

§Examples
use futures::stream::TryStreamExt;
let thread: Thread = lua.load(r#"
    coroutine.create(function (sum)
        for i = 1,10 do
            sum = sum + i
            coroutine.yield(sum)
        end
        return sum
    end)
"#).eval()?;

let mut stream = thread.into_async::<_, i64>(1);
let mut sum = 0;
while let Some(n) = stream.try_next().await? {
    sum += n;
}

assert_eq!(sum, 286);

Trait Implementations§

Source§

impl<'lua> Clone for Thread<'lua>

Source§

fn clone(&self) -> Thread<'lua>

Returns a copy 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<'lua> Debug for Thread<'lua>

Source§

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

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

impl<'lua> FromLua<'lua> for Thread<'lua>

Source§

fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result<Thread<'lua>>

Performs the conversion.
Source§

impl<'lua> PartialEq for Thread<'lua>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<'lua> ToLua<'lua> for Thread<'lua>

Source§

fn to_lua(self, _: &'lua Lua) -> Result<Value<'lua>>

Performs the conversion.

Auto Trait Implementations§

§

impl<'lua> Freeze for Thread<'lua>

§

impl<'lua> !RefUnwindSafe for Thread<'lua>

§

impl<'lua> !Send for Thread<'lua>

§

impl<'lua> !Sync for Thread<'lua>

§

impl<'lua> Unpin for Thread<'lua>

§

impl<'lua> !UnwindSafe for Thread<'lua>

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<'lua, T> FromLuaMulti<'lua> for T
where T: FromLua<'lua>,

Source§

fn from_lua_multi(values: MultiValue<'lua>, lua: &'lua Lua) -> Result<T, Error>

Performs the conversion. Read more
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<'lua, T> ToLuaMulti<'lua> for T
where T: ToLua<'lua>,

Source§

fn to_lua_multi(self, lua: &'lua Lua) -> Result<MultiValue<'lua>, Error>

Performs the conversion.
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.