use std::pin::Pin; use mlua::{UserData, prelude::LuaUserDataMethods}; use tokio::pin; use tokio_stream::StreamExt; use yazi_shared::errors::InputError; pub struct InputRx>> { inner: T, } impl>> InputRx { pub fn new(inner: T) -> Self { Self { inner } } pub async fn consume(inner: T) -> (Option, u8) { pin!(inner); inner.next().await.map(Self::parse).unwrap_or((None, 0)) } fn parse(res: Result) -> (Option, u8) { match res { Ok(s) => (Some(s), 1), Err(InputError::Canceled(s)) => (Some(s), 2), Err(InputError::Typed(s)) => (Some(s), 3), _ => (None, 0), } } } impl> + 'static> UserData for InputRx { fn add_methods>(methods: &mut M) { methods.add_async_method_mut("recv", |_, mut me, ()| async move { let mut inner = unsafe { Pin::new_unchecked(&mut me.inner) }; Ok(inner.next().await.map(Self::parse).unwrap_or((None, 0))) }); } }