Support ctrl-c cancellation in from csv/tsv

This commit is contained in:
Reilly Wood 2024-06-05 21:22:52 -07:00
parent 75d5807dcd
commit 280ddcfe1e
3 changed files with 11 additions and 5 deletions

View File

@ -176,7 +176,8 @@ fn from_csv(
trim, trim,
}; };
from_delimited_data(config, input, name) let ctrlc = engine_state.ctrlc.clone();
from_delimited_data(config, input, name, ctrlc)
} }
#[cfg(test)] #[cfg(test)]

View File

@ -1,3 +1,5 @@
use std::sync::{atomic::AtomicBool, Arc};
use csv::{ReaderBuilder, Trim}; use csv::{ReaderBuilder, Trim};
use nu_protocol::{ByteStream, ListStream, PipelineData, ShellError, Span, Value}; use nu_protocol::{ByteStream, ListStream, PipelineData, ShellError, Span, Value};
@ -21,6 +23,7 @@ fn from_delimited_stream(
}: DelimitedReaderConfig, }: DelimitedReaderConfig,
input: ByteStream, input: ByteStream,
span: Span, span: Span,
ctrl_c: Option<Arc<AtomicBool>>,
) -> Result<ListStream, ShellError> { ) -> Result<ListStream, ShellError> {
let input_reader = if let Some(stream) = input.reader() { let input_reader = if let Some(stream) = input.reader() {
stream stream
@ -83,7 +86,7 @@ fn from_delimited_stream(
Value::record(columns.zip(values).collect(), span) Value::record(columns.zip(values).collect(), span)
}); });
Ok(ListStream::new(iter, span, None)) Ok(ListStream::new(iter, span, ctrl_c))
} }
pub(super) struct DelimitedReaderConfig { pub(super) struct DelimitedReaderConfig {
@ -101,6 +104,7 @@ pub(super) fn from_delimited_data(
config: DelimitedReaderConfig, config: DelimitedReaderConfig,
input: PipelineData, input: PipelineData,
name: Span, name: Span,
ctrl_c: Option<Arc<AtomicBool>>,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
match input { match input {
PipelineData::Empty => Ok(PipelineData::Empty), PipelineData::Empty => Ok(PipelineData::Empty),
@ -108,7 +112,7 @@ pub(super) fn from_delimited_data(
let string = value.into_string()?; let string = value.into_string()?;
let byte_stream = ByteStream::read_string(string, name, None); let byte_stream = ByteStream::read_string(string, name, None);
Ok(PipelineData::ListStream( Ok(PipelineData::ListStream(
from_delimited_stream(config, byte_stream, name)?, from_delimited_stream(config, byte_stream, name, ctrl_c)?,
metadata, metadata,
)) ))
} }
@ -119,7 +123,7 @@ pub(super) fn from_delimited_data(
src_span: list_stream.span(), src_span: list_stream.span(),
}), }),
PipelineData::ByteStream(byte_stream, metadata) => Ok(PipelineData::ListStream( PipelineData::ByteStream(byte_stream, metadata) => Ok(PipelineData::ListStream(
from_delimited_stream(config, byte_stream, name)?, from_delimited_stream(config, byte_stream, name, ctrl_c)?,
metadata, metadata,
)), )),
} }

View File

@ -142,7 +142,8 @@ fn from_tsv(
trim, trim,
}; };
from_delimited_data(config, input, name) let ctrlc = engine_state.ctrlc.clone();
from_delimited_data(config, input, name, ctrlc)
} }
#[cfg(test)] #[cfg(test)]