mirror of
https://github.com/nushell/nushell
synced 2025-01-19 08:34:30 +00:00
b634f1b010
# Description The issue #10318 is resolved by introducing helper methods within the existing `get_documentation` function in the nu-engine crate. Initially, I considered using nu-color-config crate to convert HEX config color to ANSI color and employing the following method [https://github.com/nushell/nushell/blob/main/crates/nu-color-config/src/color_config.rs#L9C1-L20C2](https://github.com/nushell/nushell/blob/main/crates/nu-color-config/src/color_config.rs#L9C1-L20C2). However, this approach was deemed impractical due to circular dependencies. Consequently, in a manner akin to how we invoke the `table` command from the nu-command crate in `get_documentation` function to create a themed-colored table, we invoke the `ansi` command from nu-command to obtain the ANSI theme color code. # User-Facing Changes Visual Changes Only: the help command now uses configured theme, else it falls back on default hard coded values. # 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 std testing; testing run-tests --path crates/nu-std"` 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. -->
78 lines
2 KiB
Rust
78 lines
2 KiB
Rust
use crate::query_json::execute_json_query;
|
|
use crate::query_web::parse_selector_params;
|
|
use crate::query_xml::execute_xpath_query;
|
|
use nu_engine::documentation::get_flags_section;
|
|
use nu_plugin::{EvaluatedCall, LabeledError, Plugin};
|
|
use nu_protocol::{PluginSignature, Spanned, Value};
|
|
use std::fmt::Write;
|
|
|
|
#[derive(Default)]
|
|
pub struct Query;
|
|
|
|
impl Query {
|
|
pub fn new() -> Self {
|
|
Default::default()
|
|
}
|
|
|
|
pub fn usage() -> &'static str {
|
|
"Usage: query"
|
|
}
|
|
|
|
pub fn query(
|
|
&self,
|
|
_name: &str,
|
|
call: &EvaluatedCall,
|
|
_value: &Value,
|
|
_path: Option<Spanned<String>>,
|
|
) -> Result<Value, LabeledError> {
|
|
let help = get_brief_subcommand_help(&Query.signature());
|
|
Ok(Value::string(help, call.head))
|
|
}
|
|
|
|
pub fn query_json(
|
|
&self,
|
|
name: &str,
|
|
call: &EvaluatedCall,
|
|
input: &Value,
|
|
query: Option<Spanned<String>>,
|
|
) -> Result<Value, LabeledError> {
|
|
execute_json_query(name, call, input, query)
|
|
}
|
|
pub fn query_web(
|
|
&self,
|
|
_name: &str,
|
|
call: &EvaluatedCall,
|
|
input: &Value,
|
|
_rest: Option<Spanned<String>>,
|
|
) -> Result<Value, LabeledError> {
|
|
parse_selector_params(call, input)
|
|
}
|
|
pub fn query_xml(
|
|
&self,
|
|
name: &str,
|
|
call: &EvaluatedCall,
|
|
input: &Value,
|
|
query: Option<Spanned<String>>,
|
|
) -> Result<Value, LabeledError> {
|
|
execute_xpath_query(name, call, input, query)
|
|
}
|
|
}
|
|
|
|
pub fn get_brief_subcommand_help(sigs: &[PluginSignature]) -> String {
|
|
let mut help = String::new();
|
|
let _ = write!(help, "{}\n\n", sigs[0].sig.usage);
|
|
let _ = write!(help, "Usage:\n > {}\n\n", sigs[0].sig.name);
|
|
help.push_str("Subcommands:\n");
|
|
|
|
for x in sigs.iter().enumerate() {
|
|
if x.0 == 0 {
|
|
continue;
|
|
}
|
|
let _ = writeln!(help, " {} - {}", x.1.sig.name, x.1.sig.usage);
|
|
}
|
|
|
|
help.push_str(&get_flags_section(None, &sigs[0].sig, |v| {
|
|
format!("{:#?}", v)
|
|
}));
|
|
help
|
|
}
|