mirror of
https://github.com/nushell/nushell.git
synced 2025-05-10 01:42:57 +00:00
# Description This makes `LabeledError` much more capable of representing close to everything a `miette::Diagnostic` can, including `ShellError`, and allows plugins to generate multiple error spans, codes, help, etc. `LabeledError` is now embeddable within `ShellError` as a transparent variant. This could also be used to improve `error make` and `try/catch` to reflect `LabeledError` exactly in the future. Also cleaned up some errors in existing plugins. # User-Facing Changes Breaking change for plugins. Nicer errors for users.
59 lines
2.0 KiB
Rust
59 lines
2.0 KiB
Rust
use crate::{
|
|
cool_custom_value::CoolCustomValue, second_custom_value::SecondCustomValue, CustomValuePlugin,
|
|
};
|
|
|
|
use nu_plugin::{EngineInterface, EvaluatedCall, SimplePluginCommand};
|
|
use nu_protocol::{
|
|
Category, LabeledError, PluginExample, PluginSignature, ShellError, Span, Value,
|
|
};
|
|
|
|
pub struct Update;
|
|
|
|
impl SimplePluginCommand for Update {
|
|
type Plugin = CustomValuePlugin;
|
|
|
|
fn signature(&self) -> PluginSignature {
|
|
PluginSignature::build("custom-value update")
|
|
.usage("PluginSignature for a plugin that updates a custom value")
|
|
.category(Category::Experimental)
|
|
.plugin_examples(vec![
|
|
PluginExample {
|
|
example: "custom-value generate | custom-value update".into(),
|
|
description: "Update a CoolCustomValue".into(),
|
|
result: Some(CoolCustomValue::new("abcxyz").into_value(Span::test_data())),
|
|
},
|
|
PluginExample {
|
|
example: "custom-value generate | custom-value update".into(),
|
|
description: "Update a SecondCustomValue".into(),
|
|
result: Some(CoolCustomValue::new("xyzabc").into_value(Span::test_data())),
|
|
},
|
|
])
|
|
}
|
|
|
|
fn run(
|
|
&self,
|
|
_plugin: &CustomValuePlugin,
|
|
_engine: &EngineInterface,
|
|
call: &EvaluatedCall,
|
|
input: &Value,
|
|
) -> Result<Value, LabeledError> {
|
|
if let Ok(mut value) = CoolCustomValue::try_from_value(input) {
|
|
value.cool += "xyz";
|
|
return Ok(value.into_value(call.head));
|
|
}
|
|
|
|
if let Ok(mut value) = SecondCustomValue::try_from_value(input) {
|
|
value.something += "abc";
|
|
return Ok(value.into_value(call.head));
|
|
}
|
|
|
|
Err(ShellError::CantConvert {
|
|
to_type: "cool or second".into(),
|
|
from_type: "non-cool and non-second".into(),
|
|
span: call.head,
|
|
help: None,
|
|
}
|
|
.into())
|
|
}
|
|
}
|