1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#[macro_export] macro_rules! return_err { ($expr:expr) => { match $expr { Err(_) => return, Ok(expr) => expr, }; }; } #[macro_export] macro_rules! stream { ($($expr:expr),*) => {{ let mut v = VecDeque::new(); $( v.push_back($expr); )* v }} } #[macro_export] macro_rules! trace_stream { (target: $target:tt, $desc:tt = $expr:expr) => {{ if log::log_enabled!(target: $target, log::Level::Trace) { use futures::stream::StreamExt; let objects = $expr.inspect(move |o| { trace!( target: $target, "{} = {}", $desc, nu_source::PrettyDebug::plain_string(o, 70) ); }); nu_stream::InputStream::from_stream(objects.boxed()) } else { $expr } }}; } #[macro_export] macro_rules! trace_out_stream { (target: $target:tt, $desc:tt = $expr:expr) => {{ if log::log_enabled!(target: $target, log::Level::Trace) { use futures::stream::StreamExt; let objects = $expr.inspect(move |o| { trace!( target: $target, "{} = {}", $desc, match o { Err(err) => format!("{:?}", err), Ok(value) => value.display(), } ); }); $crate::stream::OutputStream::new(objects) } else { $expr } }}; } pub(crate) use futures::stream::BoxStream; pub(crate) use futures::{Stream, StreamExt}; pub(crate) use std::collections::VecDeque; pub(crate) use std::future::Future; pub(crate) use std::sync::Arc; pub(crate) use crate::{InputStream, OutputStream}; #[allow(clippy::wrong_self_convention)] pub trait ToOutputStream { fn to_output_stream(self) -> OutputStream; } impl<T, U> ToOutputStream for T where T: Stream<Item = U> + Send + 'static, U: Into<nu_protocol::ReturnValue>, { fn to_output_stream(self) -> OutputStream { OutputStream { values: self.map(|item| item.into()).boxed(), } } }