<!-- if this PR closes one or more issues, you can automatically link the PR with them by using one of the [*linking keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword), e.g. - this PR should close #xxxx - fixes #xxxx you can also mention related issues, PRs or discussions! --> # Description <!-- Thank you for improving Nushell. Please, check our [contributing guide](../CONTRIBUTING.md) and talk to the core team before making major changes. Description of your pull request goes here. **Provide examples and/or screenshots** if your changes affect the user experience. --> Added comments to support API docs for the `nu-plugin` crate. Removed a few items that I'd expect should only be used internally to Nushell from the documentation and reduced the visibility of some items that did not need to be public. # User-Facing Changes <!-- List of all changes that impact the user experience here. This helps us keep track of breaking changes. --> There should be no user facing impact. # 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 -A clippy::needless_collect -A clippy::result_large_err` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass - `cargo run -- crates/nu-std/tests/run.nu` 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 > ``` --> Standard tests run. Additionally numerous doctests were added to the `nu-plugin` crate. # 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. --> No changes to the website necessary.
121 lines
3.7 KiB
Rust
121 lines
3.7 KiB
Rust
mod evaluated_call;
|
|
mod plugin_custom_value;
|
|
mod plugin_data;
|
|
|
|
pub use evaluated_call::EvaluatedCall;
|
|
use nu_protocol::{PluginSignature, ShellError, Span, Value};
|
|
pub use plugin_custom_value::PluginCustomValue;
|
|
pub use plugin_data::PluginData;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
pub struct CallInfo {
|
|
pub name: String,
|
|
pub call: EvaluatedCall,
|
|
pub input: CallInput,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, PartialEq)]
|
|
pub enum CallInput {
|
|
Value(Value),
|
|
Data(PluginData),
|
|
}
|
|
|
|
// Information sent to the plugin
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
pub enum PluginCall {
|
|
Signature,
|
|
CallInfo(CallInfo),
|
|
CollapseCustomValue(PluginData),
|
|
}
|
|
|
|
/// An error message with debugging information that can be passed to Nushell from the plugin
|
|
///
|
|
/// The `LabeledError` struct is a structured error message that can be returned from
|
|
/// a [Plugin](crate::Plugin)'s [`run`](crate::Plugin::run()) method. It contains
|
|
/// the error message along with optional [Span] data to support highlighting in the
|
|
/// shell.
|
|
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
|
pub struct LabeledError {
|
|
/// The name of the error
|
|
pub label: String,
|
|
/// A detailed error description
|
|
pub msg: String,
|
|
/// The [Span] in which the error occurred
|
|
pub span: Option<Span>,
|
|
}
|
|
|
|
impl From<LabeledError> for ShellError {
|
|
fn from(error: LabeledError) -> Self {
|
|
match error.span {
|
|
Some(span) => {
|
|
ShellError::GenericError(error.label, error.msg, Some(span), None, Vec::new())
|
|
}
|
|
None => ShellError::GenericError(
|
|
error.label,
|
|
"".to_string(),
|
|
None,
|
|
Some(error.msg),
|
|
Vec::new(),
|
|
),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<ShellError> for LabeledError {
|
|
fn from(error: ShellError) -> Self {
|
|
match error {
|
|
ShellError::GenericError(label, msg, span, _help, _related) => {
|
|
LabeledError { label, msg, span }
|
|
}
|
|
ShellError::CantConvert {
|
|
to_type: expected,
|
|
from_type: input,
|
|
span,
|
|
help: _help,
|
|
} => LabeledError {
|
|
label: format!("Can't convert to {expected}"),
|
|
msg: format!("can't convert {expected} to {input}"),
|
|
span: Some(span),
|
|
},
|
|
ShellError::DidYouMean(suggestion, span) => LabeledError {
|
|
label: "Name not found".into(),
|
|
msg: format!("did you mean '{suggestion}'"),
|
|
span: Some(span),
|
|
},
|
|
ShellError::PluginFailedToLoad(msg) => LabeledError {
|
|
label: "Plugin failed to load".into(),
|
|
msg,
|
|
span: None,
|
|
},
|
|
ShellError::PluginFailedToEncode(msg) => LabeledError {
|
|
label: "Plugin failed to encode".into(),
|
|
msg,
|
|
span: None,
|
|
},
|
|
ShellError::PluginFailedToDecode(msg) => LabeledError {
|
|
label: "Plugin failed to decode".into(),
|
|
msg,
|
|
span: None,
|
|
},
|
|
err => LabeledError {
|
|
label: "Error - Add to LabeledError From<ShellError>".into(),
|
|
msg: err.to_string(),
|
|
span: None,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
// Information received from the plugin
|
|
// Needs to be public to communicate with nu-parser but not typically
|
|
// used by Plugin authors
|
|
#[doc(hidden)]
|
|
#[derive(Serialize, Deserialize)]
|
|
pub enum PluginResponse {
|
|
Error(LabeledError),
|
|
Signature(Vec<PluginSignature>),
|
|
Value(Box<Value>),
|
|
PluginData(String, PluginData),
|
|
}
|