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:
Ian Manske
2024-07-07 22:29:01 +00:00
committed by GitHub
parent c6b6b1b7a8
commit 399a7c8836
246 changed files with 1332 additions and 1234 deletions

View File

@ -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,

View File

@ -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)),

View File

@ -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(

View File

@ -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};

View File

@ -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),

View File

@ -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();