mirror of
https://github.com/nushell/nushell.git
synced 2025-08-16 14:01:01 +02:00
Add and use new Signals
struct (#13314)
# Description This PR introduces a new `Signals` struct to replace our adhoc passing around of `ctrlc: Option<Arc<AtomicBool>>`. Doing so has a few benefits: - We can better enforce when/where resetting or triggering an interrupt is allowed. - Consolidates `nu_utils::ctrl_c::was_pressed` and other ad-hoc re-implementations into a single place: `Signals::check`. - This allows us to add other types of signals later if we want. E.g., exiting or suspension. - Similarly, we can more easily change the underlying implementation if we need to in the future. - Places that used to have a `ctrlc` of `None` now use `Signals::empty()`, so we can double check these usages for correctness in the future.
This commit is contained in:
@ -67,12 +67,11 @@ fn convert_value_to_string(
|
||||
let config = engine_state.get_config();
|
||||
Ok(vals[0][0].to_abbreviated_string(config))
|
||||
} else {
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let config = engine_state.get_config();
|
||||
let style_computer = StyleComputer::from_config(engine_state, stack);
|
||||
|
||||
Ok(nu_common::try_build_table(
|
||||
ctrlc,
|
||||
engine_state.signals(),
|
||||
config,
|
||||
&style_computer,
|
||||
value,
|
||||
|
@ -63,7 +63,6 @@ impl Command for Explore {
|
||||
let tail: bool = call.has_flag(engine_state, stack, "tail")?;
|
||||
let peek_value: bool = call.has_flag(engine_state, stack, "peek")?;
|
||||
|
||||
let ctrlc = engine_state.ctrlc.clone();
|
||||
let nu_config = engine_state.get_config();
|
||||
let style_computer = StyleComputer::from_config(engine_state, stack);
|
||||
|
||||
@ -83,7 +82,7 @@ impl Command for Explore {
|
||||
tail,
|
||||
);
|
||||
|
||||
let result = run_pager(engine_state, &mut stack.clone(), ctrlc, input, config);
|
||||
let result = run_pager(engine_state, &mut stack.clone(), input, config);
|
||||
|
||||
match result {
|
||||
Ok(Some(value)) => Ok(PipelineData::Value(value, None)),
|
||||
|
@ -11,7 +11,7 @@ use commands::{ExpandCmd, HelpCmd, NuCmd, QuitCmd, TableCmd, TryCmd};
|
||||
pub use default_context::add_explore_context;
|
||||
pub use explore::Explore;
|
||||
use explore::ExploreConfig;
|
||||
use nu_common::{collect_pipeline, has_simple_value, CtrlC};
|
||||
use nu_common::{collect_pipeline, has_simple_value};
|
||||
use nu_protocol::{
|
||||
engine::{EngineState, Stack},
|
||||
PipelineData, Value,
|
||||
@ -28,7 +28,6 @@ mod util {
|
||||
fn run_pager(
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
ctrlc: CtrlC,
|
||||
input: PipelineData,
|
||||
config: PagerConfig,
|
||||
) -> Result<Option<Value>> {
|
||||
@ -45,14 +44,14 @@ fn run_pager(
|
||||
p.show_message("For help type :help");
|
||||
|
||||
let view = binary_view(input, config.explore_config)?;
|
||||
return p.run(engine_state, stack, ctrlc, Some(view), commands);
|
||||
return p.run(engine_state, stack, Some(view), commands);
|
||||
}
|
||||
|
||||
let (columns, data) = collect_pipeline(input)?;
|
||||
|
||||
let has_no_input = columns.is_empty() && data.is_empty();
|
||||
if has_no_input {
|
||||
return p.run(engine_state, stack, ctrlc, help_view(), commands);
|
||||
return p.run(engine_state, stack, help_view(), commands);
|
||||
}
|
||||
|
||||
p.show_message("For help type :help");
|
||||
@ -60,11 +59,11 @@ fn run_pager(
|
||||
if let Some(value) = has_simple_value(&data) {
|
||||
let text = value.to_abbreviated_string(config.nu_config);
|
||||
let view = Some(Page::new(Preview::new(&text), false));
|
||||
return p.run(engine_state, stack, ctrlc, view, commands);
|
||||
return p.run(engine_state, stack, view, commands);
|
||||
}
|
||||
|
||||
let view = create_record_view(columns, data, is_record, config);
|
||||
p.run(engine_state, stack, ctrlc, view, commands)
|
||||
p.run(engine_state, stack, view, commands)
|
||||
}
|
||||
|
||||
fn create_record_view(
|
||||
|
@ -6,13 +6,11 @@ mod value;
|
||||
|
||||
use nu_color_config::TextStyle;
|
||||
use nu_protocol::Value;
|
||||
use std::sync::{atomic::AtomicBool, Arc};
|
||||
|
||||
pub use nu_ansi_term::{Color as NuColor, Style as NuStyle};
|
||||
pub use nu_protocol::{Config as NuConfig, Span as NuSpan};
|
||||
|
||||
pub type NuText = (String, TextStyle);
|
||||
pub type CtrlC = Option<Arc<AtomicBool>>;
|
||||
|
||||
pub use command::run_command_with_value;
|
||||
pub use lscolor::{create_lscolors, lscolorize};
|
||||
|
@ -1,22 +1,21 @@
|
||||
use crate::nu_common::NuConfig;
|
||||
use nu_color_config::StyleComputer;
|
||||
use nu_protocol::{Record, Span, Value};
|
||||
use nu_protocol::{Record, Signals, Span, Value};
|
||||
use nu_table::{
|
||||
common::{nu_value_to_string, nu_value_to_string_clean},
|
||||
ExpandedTable, TableOpts,
|
||||
};
|
||||
use std::sync::{atomic::AtomicBool, Arc};
|
||||
|
||||
pub fn try_build_table(
|
||||
ctrlc: Option<Arc<AtomicBool>>,
|
||||
signals: &Signals,
|
||||
config: &NuConfig,
|
||||
style_computer: &StyleComputer,
|
||||
value: Value,
|
||||
) -> String {
|
||||
let span = value.span();
|
||||
match value {
|
||||
Value::List { vals, .. } => try_build_list(vals, ctrlc, config, span, style_computer),
|
||||
Value::Record { val, .. } => try_build_map(&val, span, style_computer, ctrlc, config),
|
||||
Value::List { vals, .. } => try_build_list(vals, signals, config, span, style_computer),
|
||||
Value::Record { val, .. } => try_build_map(&val, span, style_computer, signals, config),
|
||||
val if matches!(val, Value::String { .. }) => {
|
||||
nu_value_to_string_clean(&val, config, style_computer).0
|
||||
}
|
||||
@ -28,13 +27,13 @@ fn try_build_map(
|
||||
record: &Record,
|
||||
span: Span,
|
||||
style_computer: &StyleComputer,
|
||||
ctrlc: Option<Arc<AtomicBool>>,
|
||||
signals: &Signals,
|
||||
config: &NuConfig,
|
||||
) -> String {
|
||||
let opts = TableOpts::new(
|
||||
config,
|
||||
style_computer,
|
||||
ctrlc,
|
||||
signals,
|
||||
Span::unknown(),
|
||||
usize::MAX,
|
||||
(config.table_indent.left, config.table_indent.right),
|
||||
@ -53,7 +52,7 @@ fn try_build_map(
|
||||
|
||||
fn try_build_list(
|
||||
vals: Vec<Value>,
|
||||
ctrlc: Option<Arc<AtomicBool>>,
|
||||
signals: &Signals,
|
||||
config: &NuConfig,
|
||||
span: Span,
|
||||
style_computer: &StyleComputer,
|
||||
@ -61,7 +60,7 @@ fn try_build_list(
|
||||
let opts = TableOpts::new(
|
||||
config,
|
||||
style_computer,
|
||||
ctrlc,
|
||||
signals,
|
||||
Span::unknown(),
|
||||
usize::MAX,
|
||||
(config.table_indent.left, config.table_indent.right),
|
||||
|
@ -11,7 +11,7 @@ use self::{
|
||||
use super::views::{Layout, View};
|
||||
use crate::{
|
||||
explore::ExploreConfig,
|
||||
nu_common::{CtrlC, NuColor, NuConfig, NuStyle},
|
||||
nu_common::{NuColor, NuConfig, NuStyle},
|
||||
registry::{Command, CommandRegistry},
|
||||
views::{util::nu_style_to_tui, ViewConfig},
|
||||
};
|
||||
@ -36,7 +36,6 @@ use std::{
|
||||
cmp::min,
|
||||
io::{self, Stdout},
|
||||
result,
|
||||
sync::atomic::Ordering,
|
||||
};
|
||||
|
||||
pub type Frame<'a> = ratatui::Frame<'a>;
|
||||
@ -89,7 +88,6 @@ impl<'a> Pager<'a> {
|
||||
&mut self,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
ctrlc: CtrlC,
|
||||
view: Option<Page>,
|
||||
commands: CommandRegistry,
|
||||
) -> Result<Option<Value>> {
|
||||
@ -114,7 +112,6 @@ impl<'a> Pager<'a> {
|
||||
&mut terminal,
|
||||
engine_state,
|
||||
stack,
|
||||
ctrlc,
|
||||
self,
|
||||
&mut info,
|
||||
view,
|
||||
@ -173,7 +170,6 @@ fn render_ui(
|
||||
term: &mut Terminal,
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
ctrlc: CtrlC,
|
||||
pager: &mut Pager<'_>,
|
||||
info: &mut ViewInfo,
|
||||
view: Option<Page>,
|
||||
@ -183,11 +179,8 @@ fn render_ui(
|
||||
let mut view_stack = ViewStack::new(view, Vec::new());
|
||||
|
||||
loop {
|
||||
// handle CTRLC event
|
||||
if let Some(ctrlc) = ctrlc.clone() {
|
||||
if ctrlc.load(Ordering::SeqCst) {
|
||||
break Ok(None);
|
||||
}
|
||||
if engine_state.signals().interrupted() {
|
||||
break Ok(None);
|
||||
}
|
||||
|
||||
let mut layout = Layout::default();
|
||||
|
Reference in New Issue
Block a user