mirror of
https://github.com/nushell/nushell
synced 2024-12-25 12:33:17 +00:00
better error handling for view source
(#14624)
# Description There is an opportunity to give a bogus block id to view source. This makes it more resilient and not panic when an invalid block id is passed in. ![image](https://github.com/user-attachments/assets/67ebbffc-be57-4ce3-8700-90f1ed080f9b) # User-Facing Changes <!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. --> # Tests + Formatting <!-- Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging)) - `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the tests for the standard library > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` --> # After Submitting <!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. -->
This commit is contained in:
parent
8f4feeb119
commit
11375c19d2
1 changed files with 19 additions and 7 deletions
|
@ -34,21 +34,33 @@ impl Command for ViewSource {
|
|||
|
||||
let source = match arg {
|
||||
Value::Int { val, .. } => {
|
||||
let block = engine_state.get_block(nu_protocol::BlockId::new(val as usize));
|
||||
if let Some(span) = block.span {
|
||||
let contents = engine_state.get_span_contents(span);
|
||||
Ok(Value::string(String::from_utf8_lossy(contents), call.head)
|
||||
.into_pipeline_data())
|
||||
if let Some(block) =
|
||||
engine_state.try_get_block(nu_protocol::BlockId::new(val as usize))
|
||||
{
|
||||
if let Some(span) = block.span {
|
||||
let contents = engine_state.get_span_contents(span);
|
||||
Ok(Value::string(String::from_utf8_lossy(contents), call.head)
|
||||
.into_pipeline_data())
|
||||
} else {
|
||||
Err(ShellError::GenericError {
|
||||
error: "Cannot view int value".to_string(),
|
||||
msg: "the block does not have a viewable span".to_string(),
|
||||
span: Some(arg_span),
|
||||
help: None,
|
||||
inner: vec![],
|
||||
})
|
||||
}
|
||||
} else {
|
||||
Err(ShellError::GenericError {
|
||||
error: "Cannot view int value".to_string(),
|
||||
msg: "the block does not have a viewable span".to_string(),
|
||||
error: format!("Block Id {} does not exist", arg.coerce_into_string()?),
|
||||
msg: "this number does not correspond to a block".to_string(),
|
||||
span: Some(arg_span),
|
||||
help: None,
|
||||
inner: vec![],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Value::String { val, .. } => {
|
||||
if let Some(decl_id) = engine_state.find_decl(val.as_bytes(), &[]) {
|
||||
// arg is a command
|
||||
|
|
Loading…
Reference in a new issue