mirror of
https://github.com/nushell/nushell
synced 2025-01-06 18:29:02 +00:00
c747ec75c9
# Description When implementing a `Command`, one must also import all the types present in the function signatures for `Command`. This makes it so that we often import the same set of types in each command implementation file. E.g., something like this: ```rust use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::{ record, Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, ShellError, Signature, Span, Type, Value, }; ``` This PR adds the `nu_engine::command_prelude` module which contains the necessary and commonly used types to implement a `Command`: ```rust // command_prelude.rs pub use crate::CallExt; pub use nu_protocol::{ ast::{Call, CellPath}, engine::{Command, EngineState, Stack}, record, Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, IntoSpanned, PipelineData, Record, ShellError, Signature, Span, Spanned, SyntaxShape, Type, Value, }; ``` This should reduce the boilerplate needed to implement a command and also gives us a place to track the breadth of the `Command` API. I tried to be conservative with what went into the prelude modules, since it might be hard/annoying to remove items from the prelude in the future. Let me know if something should be included or excluded.
71 lines
2.3 KiB
Rust
71 lines
2.3 KiB
Rust
mod char_;
|
|
mod detect_columns;
|
|
mod encode_decode;
|
|
mod format;
|
|
mod guess_width;
|
|
mod parse;
|
|
mod split;
|
|
mod str_;
|
|
|
|
pub use char_::Char;
|
|
pub use detect_columns::*;
|
|
pub use encode_decode::*;
|
|
pub use format::*;
|
|
pub use parse::*;
|
|
pub use split::*;
|
|
pub use str_::*;
|
|
|
|
use nu_engine::CallExt;
|
|
use nu_protocol::{
|
|
ast::Call,
|
|
engine::{EngineState, Stack, StateWorkingSet},
|
|
ShellError,
|
|
};
|
|
|
|
// For handling the grapheme_cluster related flags on some commands.
|
|
// This ensures the error messages are consistent.
|
|
pub fn grapheme_flags(
|
|
engine_state: &EngineState,
|
|
stack: &mut Stack,
|
|
call: &Call,
|
|
) -> Result<bool, ShellError> {
|
|
let g_flag = call.has_flag(engine_state, stack, "grapheme-clusters")?;
|
|
// Check for the other flags and produce errors if they exist.
|
|
// Note that Nushell already prevents nonexistent flags from being used with commands,
|
|
// so this function can be reused for both the --utf-8-bytes commands and the --code-points commands.
|
|
if g_flag && call.has_flag(engine_state, stack, "utf-8-bytes")? {
|
|
Err(ShellError::IncompatibleParametersSingle {
|
|
msg: "Incompatible flags: --grapheme-clusters (-g) and --utf-8-bytes (-b)".to_string(),
|
|
span: call.head,
|
|
})?
|
|
}
|
|
if g_flag && call.has_flag(engine_state, stack, "code-points")? {
|
|
Err(ShellError::IncompatibleParametersSingle {
|
|
msg: "Incompatible flags: --grapheme-clusters (-g) and --utf-8-bytes (-b)".to_string(),
|
|
span: call.head,
|
|
})?
|
|
}
|
|
// Grapheme cluster usage is decided by the non-default -g flag
|
|
Ok(g_flag)
|
|
}
|
|
|
|
// Const version of grapheme_flags
|
|
pub fn grapheme_flags_const(
|
|
working_set: &StateWorkingSet,
|
|
call: &Call,
|
|
) -> Result<bool, ShellError> {
|
|
let g_flag = call.has_flag_const(working_set, "grapheme-clusters")?;
|
|
if g_flag && call.has_flag_const(working_set, "utf-8-bytes")? {
|
|
Err(ShellError::IncompatibleParametersSingle {
|
|
msg: "Incompatible flags: --grapheme-clusters (-g) and --utf-8-bytes (-b)".to_string(),
|
|
span: call.head,
|
|
})?
|
|
}
|
|
if g_flag && call.has_flag_const(working_set, "code-points")? {
|
|
Err(ShellError::IncompatibleParametersSingle {
|
|
msg: "Incompatible flags: --grapheme-clusters (-g) and --utf-8-bytes (-b)".to_string(),
|
|
span: call.head,
|
|
})?
|
|
}
|
|
Ok(g_flag)
|
|
}
|