mirror of
https://github.com/nushell/nushell.git
synced 2025-08-18 22:46:02 +02:00
Add helper method to check whether ctrl+c was pressed, adopt it (#7482)
I've been working on streaming and pipeline interruption lately. It was bothering me that checking ctrl+c (something we want to do often) always requires a bunch of boilerplate like: ```rust use std::sync::atomic::Ordering; if let Some(ctrlc) = &engine_state.ctrlc { if ctrlc.load(Ordering::SeqCst) { ... ``` I added a helper method to cut that down to: ```rust if nu_utils::ctrl_c::was_pressed(&engine_state.ctrlc) { ... ```
This commit is contained in:
@@ -12,12 +12,7 @@ use nu_table::{string_width, Alignment, Table as NuTable, TableConfig, TableThem
|
||||
use nu_utils::get_ls_colors;
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
use std::{
|
||||
cmp::max,
|
||||
collections::HashMap,
|
||||
path::PathBuf,
|
||||
sync::atomic::{AtomicBool, Ordering},
|
||||
};
|
||||
use std::{cmp::max, collections::HashMap, path::PathBuf, sync::atomic::AtomicBool};
|
||||
use terminal_size::{Height, Width};
|
||||
use url::Url;
|
||||
|
||||
@@ -304,13 +299,8 @@ fn handle_table_command(
|
||||
|
||||
let result = strip_output_color(result, config);
|
||||
|
||||
let ctrl_c_was_triggered = || match &ctrlc {
|
||||
Some(ctrlc) => ctrlc.load(Ordering::SeqCst),
|
||||
None => false,
|
||||
};
|
||||
|
||||
let result = result.unwrap_or_else(|| {
|
||||
if ctrl_c_was_triggered() {
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
"".into()
|
||||
} else {
|
||||
// assume this failed because the table was too wide
|
||||
@@ -397,11 +387,8 @@ fn build_general_table2(
|
||||
) -> Result<Option<String>, ShellError> {
|
||||
let mut data = Vec::with_capacity(vals.len());
|
||||
for (column, value) in cols.into_iter().zip(vals.into_iter()) {
|
||||
// handle CTRLC event
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let row = vec![
|
||||
@@ -460,11 +447,8 @@ fn build_expanded_table(
|
||||
|
||||
let mut data = Vec::with_capacity(cols.len());
|
||||
for (key, value) in cols.into_iter().zip(vals) {
|
||||
// handle CTRLC event
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let is_limited = matches!(expand_limit, Some(0));
|
||||
@@ -810,10 +794,8 @@ fn convert_to_table(
|
||||
};
|
||||
|
||||
for (row_num, item) in input.enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
if let Value::Error { error } = item {
|
||||
@@ -925,10 +907,8 @@ fn convert_to_table2<'a>(
|
||||
}
|
||||
|
||||
for (row, item) in input.clone().into_iter().enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
if let Value::Error { error } = item {
|
||||
@@ -960,10 +940,8 @@ fn convert_to_table2<'a>(
|
||||
|
||||
if !with_header {
|
||||
for (row, item) in input.into_iter().enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
if let Value::Error { error } = item {
|
||||
@@ -1019,10 +997,8 @@ fn convert_to_table2<'a>(
|
||||
data[0].push(NuTable::create_cell(&header, header_style(color_hm)));
|
||||
|
||||
for (row, item) in input.clone().into_iter().enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
if let Value::Error { error } = item {
|
||||
@@ -1059,10 +1035,8 @@ fn convert_to_table2<'a>(
|
||||
column_width = string_width(&header);
|
||||
|
||||
for (row, item) in input.clone().into_iter().enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let value = create_table2_entry_basic(item, &header, head, config, color_hm);
|
||||
@@ -1086,10 +1060,8 @@ fn convert_to_table2<'a>(
|
||||
column_width = string_width(&header);
|
||||
|
||||
for (row, item) in input.clone().into_iter().enumerate() {
|
||||
if let Some(ctrlc) = &ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
return Ok(None);
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&ctrlc) {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let value = create_table2_entry_basic(item, &header, head, config, color_hm);
|
||||
@@ -1593,10 +1565,8 @@ impl Iterator for PagingTableCreator {
|
||||
break;
|
||||
}
|
||||
|
||||
if let Some(ctrlc) = &self.ctrlc {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
break;
|
||||
}
|
||||
if nu_utils::ctrl_c::was_pressed(&self.ctrlc) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user