mirror of
https://github.com/nushell/nushell.git
synced 2025-08-19 07:41:30 +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:
@@ -8,7 +8,7 @@ use crate::{
|
||||
},
|
||||
eval_const::create_nu_constant,
|
||||
BlockId, Category, Config, DeclId, FileId, GetSpan, HistoryConfig, Module, ModuleId, OverlayId,
|
||||
ShellError, Signature, Span, SpanId, Type, Value, VarId, VirtualPathId,
|
||||
ShellError, Signals, Signature, Span, SpanId, Type, Value, VarId, VirtualPathId,
|
||||
};
|
||||
use fancy_regex::Regex;
|
||||
use lru::LruCache;
|
||||
@@ -84,7 +84,7 @@ pub struct EngineState {
|
||||
pub spans: Vec<Span>,
|
||||
usage: Usage,
|
||||
pub scope: ScopeFrame,
|
||||
pub ctrlc: Option<Arc<AtomicBool>>,
|
||||
signals: Signals,
|
||||
pub env_vars: Arc<EnvVars>,
|
||||
pub previous_env_vars: Arc<HashMap<String, Value>>,
|
||||
pub config: Arc<Config>,
|
||||
@@ -144,7 +144,7 @@ impl EngineState {
|
||||
0,
|
||||
false,
|
||||
),
|
||||
ctrlc: None,
|
||||
signals: Signals::empty(),
|
||||
env_vars: Arc::new(
|
||||
[(DEFAULT_OVERLAY_NAME.to_string(), HashMap::new())]
|
||||
.into_iter()
|
||||
@@ -177,6 +177,18 @@ impl EngineState {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn signals(&self) -> &Signals {
|
||||
&self.signals
|
||||
}
|
||||
|
||||
pub fn reset_signals(&mut self) {
|
||||
self.signals.reset()
|
||||
}
|
||||
|
||||
pub fn set_signals(&mut self, signals: Signals) {
|
||||
self.signals = signals;
|
||||
}
|
||||
|
||||
/// Merges a `StateDelta` onto the current state. These deltas come from a system, like the parser, that
|
||||
/// creates a new set of definitions and visible symbols in the current scope. We make this transactional
|
||||
/// as there are times when we want to run the parser and immediately throw away the results (namely:
|
||||
|
Reference in New Issue
Block a user