mirror of
https://github.com/nushell/nushell
synced 2025-01-08 03:09:00 +00:00
74 lines
1.9 KiB
Rust
74 lines
1.9 KiB
Rust
|
use std::io::Write;
|
||
|
|
||
|
use nu_protocol::{
|
||
|
ast::Call,
|
||
|
engine::{EngineState, Stack},
|
||
|
PipelineData, ShellError, Span, Value,
|
||
|
};
|
||
|
|
||
|
pub fn print_pipeline_data(
|
||
|
input: PipelineData,
|
||
|
engine_state: &EngineState,
|
||
|
stack: &mut Stack,
|
||
|
) -> Result<(), ShellError> {
|
||
|
// If the table function is in the declarations, then we can use it
|
||
|
// to create the table value that will be printed in the terminal
|
||
|
|
||
|
let config = stack.get_config().unwrap_or_default();
|
||
|
|
||
|
let stdout = std::io::stdout();
|
||
|
|
||
|
if let PipelineData::RawStream(stream, _, _) = input {
|
||
|
for s in stream {
|
||
|
let _ = stdout.lock().write_all(s?.as_binary()?);
|
||
|
}
|
||
|
return Ok(());
|
||
|
}
|
||
|
|
||
|
match engine_state.find_decl("table".as_bytes()) {
|
||
|
Some(decl_id) => {
|
||
|
let table = engine_state.get_decl(decl_id).run(
|
||
|
engine_state,
|
||
|
stack,
|
||
|
&Call::new(Span::new(0, 0)),
|
||
|
input,
|
||
|
)?;
|
||
|
|
||
|
for item in table {
|
||
|
let stdout = std::io::stdout();
|
||
|
|
||
|
if let Value::Error { error } = item {
|
||
|
return Err(error);
|
||
|
}
|
||
|
|
||
|
let mut out = item.into_string("\n", &config);
|
||
|
out.push('\n');
|
||
|
|
||
|
match stdout.lock().write_all(out.as_bytes()) {
|
||
|
Ok(_) => (),
|
||
|
Err(err) => eprintln!("{}", err),
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
None => {
|
||
|
for item in input {
|
||
|
let stdout = std::io::stdout();
|
||
|
|
||
|
if let Value::Error { error } = item {
|
||
|
return Err(error);
|
||
|
}
|
||
|
|
||
|
let mut out = item.into_string("\n", &config);
|
||
|
out.push('\n');
|
||
|
|
||
|
match stdout.lock().write_all(out.as_bytes()) {
|
||
|
Ok(_) => (),
|
||
|
Err(err) => eprintln!("{}", err),
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Ok(())
|
||
|
}
|