From 3dae2af950f027dd6218f07b13cab6427ef73822 Mon Sep 17 00:00:00 2001 From: reuben olinsky Date: Fri, 17 May 2024 23:48:06 -0700 Subject: [PATCH] Updates --- shell/src/builtin.rs | 113 +++++++++++++++++- shell/src/builtins/alias.rs | 1 + shell/src/builtins/bg.rs | 2 + shell/src/builtins/{brea.rs => break_.rs} | 1 + shell/src/builtins/builtin_.rs | 3 + shell/src/builtins/colon.rs | 1 + shell/src/builtins/complete.rs | 3 + .../src/builtins/{continu.rs => continue_.rs} | 1 + shell/src/builtins/declare.rs | 5 +- shell/src/builtins/dirs.rs | 1 + shell/src/builtins/dot.rs | 1 + shell/src/builtins/echo.rs | 1 + shell/src/builtins/enable.rs | 1 + shell/src/builtins/eval.rs | 1 + shell/src/builtins/exec.rs | 1 + shell/src/builtins/exit.rs | 1 + shell/src/builtins/export.rs | 1 + shell/src/builtins/false_.rs | 1 + shell/src/builtins/fg.rs | 1 + shell/src/builtins/getopts.rs | 1 + shell/src/builtins/help.rs | 46 +++++-- shell/src/builtins/jobs.rs | 1 + shell/src/builtins/kill.rs | 1 + shell/src/builtins/let_.rs | 1 + shell/src/builtins/mod.rs | 27 +++-- shell/src/builtins/popd.rs | 1 + shell/src/builtins/printf.rs | 1 + shell/src/builtins/pushd.rs | 1 + shell/src/builtins/pwd.rs | 1 + shell/src/builtins/read.rs | 1 + shell/src/builtins/{retur.rs => return_.rs} | 1 + shell/src/builtins/set.rs | 1 + shell/src/builtins/shift.rs | 1 + shell/src/builtins/shopt.rs | 1 + shell/src/builtins/test.rs | 1 + shell/src/builtins/trap.rs | 1 + shell/src/builtins/true_.rs | 1 + shell/src/builtins/type_.rs | 1 + shell/src/builtins/umask.rs | 1 + shell/src/builtins/unalias.rs | 1 + shell/src/builtins/unimp.rs | 1 + shell/src/builtins/unset.rs | 1 + shell/src/builtins/wait.rs | 1 + shell/src/completion.rs | 1 - shell/src/variables.rs | 1 - 45 files changed, 204 insertions(+), 33 deletions(-) rename shell/src/builtins/{brea.rs => break_.rs} (94%) rename shell/src/builtins/{continu.rs => continue_.rs} (92%) rename shell/src/builtins/{retur.rs => return_.rs} (95%) diff --git a/shell/src/builtin.rs b/shell/src/builtin.rs index fa6961be..f911d0c4 100644 --- a/shell/src/builtin.rs +++ b/shell/src/builtin.rs @@ -116,9 +116,14 @@ pub trait BuiltinCommand: Parser { context: context::CommandExecutionContext<'_>, ) -> Result; - #[allow(dead_code)] - fn get_long_help() -> String { - Self::command().render_long_help().to_string() + fn get_content(name: &str, content_type: BuiltinContentType) -> String { + match content_type { + BuiltinContentType::DetailedHelp => Self::command().render_help().to_string(), + BuiltinContentType::ShortUsage => get_builtin_short_usage(name, &Self::command()), + BuiltinContentType::ShortDescription => { + get_builtin_short_description(name, &Self::command()) + } + } } } @@ -128,14 +133,21 @@ pub trait BuiltinDeclarationCommand: BuiltinCommand { fn set_declarations(&mut self, declarations: Vec); } +#[allow(clippy::module_name_repetitions)] +pub enum BuiltinContentType { + DetailedHelp, + ShortUsage, + ShortDescription, +} + #[allow(clippy::module_name_repetitions)] #[derive(Clone)] pub struct BuiltinRegistration { /// Function to execute the builtin. pub execute_func: BuiltinCommandExecuteFunc, - /// Function to retrieve the builtin's detailed help text. - pub help_func: fn() -> String, + /// Function to retrieve the builtin's content/help text. + pub content_func: fn(&str, BuiltinContentType) -> String, /// Has this registration been disabled? pub disabled: bool, @@ -146,3 +158,94 @@ pub struct BuiltinRegistration { /// Is this builtin one that takes specially handled declarations? pub declaration_builtin: bool, } + +fn get_builtin_short_description(name: &str, command: &clap::Command) -> String { + let about = command + .get_about() + .map_or_else(String::new, |s| s.to_string()); + + std::format!("{name} - {about}\n") +} + +fn get_builtin_short_usage(name: &str, command: &clap::Command) -> String { + let mut usage = String::new(); + + let mut needs_space = false; + + let mut optional_short_opts = vec![]; + let mut required_short_opts = vec![]; + for opt in command.get_opts() { + if opt.is_hide_set() { + continue; + } + + if let Some(c) = opt.get_short() { + if !opt.is_required_set() { + optional_short_opts.push(c); + } else { + required_short_opts.push(c); + } + } + } + + if !optional_short_opts.is_empty() { + if needs_space { + usage.push(' '); + } + + usage.push('['); + usage.push('-'); + for c in optional_short_opts { + usage.push(c); + } + + usage.push(']'); + needs_space = true; + } + + if !required_short_opts.is_empty() { + if needs_space { + usage.push(' '); + } + + usage.push('-'); + for c in required_short_opts { + usage.push(c); + } + + needs_space = true; + } + + for pos in command.get_positionals() { + if pos.is_hide_set() { + continue; + } + + if !pos.is_required_set() { + if needs_space { + usage.push(' '); + } + + usage.push('['); + needs_space = false; + } + + if let Some(names) = pos.get_value_names() { + for name in names { + if needs_space { + usage.push(' '); + } + + usage.push_str(name); + needs_space = true; + } + } + + if !pos.is_required_set() { + usage.push(']'); + needs_space = true; + } + } + + std::format!("{name}: {name} {usage}\n") +} diff --git a/shell/src/builtins/alias.rs b/shell/src/builtins/alias.rs index 535ac23d..121420a3 100644 --- a/shell/src/builtins/alias.rs +++ b/shell/src/builtins/alias.rs @@ -10,6 +10,7 @@ pub(crate) struct AliasCommand { #[arg(short = 'p')] print: bool, + /// List of aliases to display or update. #[arg(name = "name[=value]")] aliases: Vec, } diff --git a/shell/src/builtins/bg.rs b/shell/src/builtins/bg.rs index e07f9022..382eda96 100644 --- a/shell/src/builtins/bg.rs +++ b/shell/src/builtins/bg.rs @@ -3,8 +3,10 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Moves a job to run in the background. #[derive(Parser)] pub(crate) struct BgCommand { + /// List of job specs to move to background. job_specs: Vec, } diff --git a/shell/src/builtins/brea.rs b/shell/src/builtins/break_.rs similarity index 94% rename from shell/src/builtins/brea.rs rename to shell/src/builtins/break_.rs index ceef30ee..4c137049 100644 --- a/shell/src/builtins/brea.rs +++ b/shell/src/builtins/break_.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Breaks out of a control-flow loop. #[derive(Parser)] pub(crate) struct BreakCommand { #[clap(default_value = "1")] diff --git a/shell/src/builtins/builtin_.rs b/shell/src/builtins/builtin_.rs index 1ac40bc0..fbe52afa 100644 --- a/shell/src/builtins/builtin_.rs +++ b/shell/src/builtins/builtin_.rs @@ -6,10 +6,13 @@ use crate::{ commands, }; +/// Directly invokes a built-in, without going through typical search order. #[derive(Parser)] pub(crate) struct BuiltiCommand { + /// Name of built-in to invoke. builtin_name: Option, + /// Arguments for the built-in. #[arg(trailing_var_arg = true, allow_hyphen_values = true)] args: Vec, } diff --git a/shell/src/builtins/colon.rs b/shell/src/builtins/colon.rs index 8307637d..15a9ce65 100644 --- a/shell/src/builtins/colon.rs +++ b/shell/src/builtins/colon.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// No-op command. #[derive(Parser)] #[clap(disable_help_flag = true, disable_version_flag = true)] pub(crate) struct ColonCommand { diff --git a/shell/src/builtins/complete.rs b/shell/src/builtins/complete.rs index b6d6c3a9..032b3ebd 100644 --- a/shell/src/builtins/complete.rs +++ b/shell/src/builtins/complete.rs @@ -168,6 +168,7 @@ impl CommonCompleteCommandArgs { } } +/// Configure programmable command completion. #[derive(Parser)] pub(crate) struct CompleteCommand { #[arg(short = 'p')] @@ -404,6 +405,7 @@ impl CompleteCommand { } } +/// Generate command completions. #[derive(Parser)] pub(crate) struct CompGenCommand { #[clap(flatten)] @@ -454,6 +456,7 @@ impl BuiltinCommand for CompGenCommand { } } +/// Set programmable command completion options. #[derive(Parser)] pub(crate) struct CompOptCommand { #[arg(short = 'D')] diff --git a/shell/src/builtins/continu.rs b/shell/src/builtins/continue_.rs similarity index 92% rename from shell/src/builtins/continu.rs rename to shell/src/builtins/continue_.rs index 7aee1059..a80eaa7e 100644 --- a/shell/src/builtins/continu.rs +++ b/shell/src/builtins/continue_.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Continue to the next iteration of a control-flow loop. #[derive(Parser)] pub(crate) struct ContinueCommand { #[clap(default_value = "1")] diff --git a/shell/src/builtins/declare.rs b/shell/src/builtins/declare.rs index cb1c7d47..b1a2df1f 100644 --- a/shell/src/builtins/declare.rs +++ b/shell/src/builtins/declare.rs @@ -23,6 +23,7 @@ builtin::minus_or_plus_flag_arg!(MakeTracedFlag, 't', ""); builtin::minus_or_plus_flag_arg!(UppercaseValueOnAssignmentFlag, 'u', ""); builtin::minus_or_plus_flag_arg!(MakeExportedFlag, 'x', ""); +/// Display or update variables and their attributes. #[derive(Parser)] pub(crate) struct DeclareCommand { /// Constrain to function names or definitions. @@ -220,7 +221,7 @@ impl DeclareCommand { // Extract the variable name and the initial value being assigned (if any). let (name, assigned_index, initial_value, name_is_array) = - self.declaration_to_name_and_value(declaration)?; + Self::declaration_to_name_and_value(declaration)?; // Figure out where we should look. let lookup = if create_var_local { @@ -283,9 +284,7 @@ impl DeclareCommand { Ok(true) } - #[allow(clippy::unused_self)] fn declaration_to_name_and_value( - &self, declaration: &CommandArg, ) -> Result<(String, Option, Option, bool), error::Error> { let name; diff --git a/shell/src/builtins/dirs.rs b/shell/src/builtins/dirs.rs index 6d8be9e2..7ae67a69 100644 --- a/shell/src/builtins/dirs.rs +++ b/shell/src/builtins/dirs.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Manage the current directory stack. #[derive(Parser, Debug, Default)] pub(crate) struct DirsCommand { #[arg(short = 'c')] diff --git a/shell/src/builtins/dot.rs b/shell/src/builtins/dot.rs index cb7bb6e7..fecacb65 100644 --- a/shell/src/builtins/dot.rs +++ b/shell/src/builtins/dot.rs @@ -7,6 +7,7 @@ use crate::{ interp::ExecutionParameters, }; +/// Evalute the provided script in the current shell environment. #[derive(Debug, Parser)] pub(crate) struct DotCommand { pub script_path: String, diff --git a/shell/src/builtins/echo.rs b/shell/src/builtins/echo.rs index affdee8b..15c49b68 100644 --- a/shell/src/builtins/echo.rs +++ b/shell/src/builtins/echo.rs @@ -4,6 +4,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use crate::escape; +/// Echo text to standard output. #[derive(Parser)] #[clap(disable_help_flag = true, disable_version_flag = true)] pub(crate) struct EchoCommand { diff --git a/shell/src/builtins/enable.rs b/shell/src/builtins/enable.rs index 1a73179c..e2f535fe 100644 --- a/shell/src/builtins/enable.rs +++ b/shell/src/builtins/enable.rs @@ -5,6 +5,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use crate::error; +/// Enable, disable, or display built-in commands. #[derive(Parser)] pub(crate) struct EnableCommand { #[arg(short = 'a')] diff --git a/shell/src/builtins/eval.rs b/shell/src/builtins/eval.rs index 68beb44d..34fb0bee 100644 --- a/shell/src/builtins/eval.rs +++ b/shell/src/builtins/eval.rs @@ -4,6 +4,7 @@ use crate::{ }; use clap::Parser; +/// Evalute the given string as script. #[derive(Parser)] pub(crate) struct EvalCommand { #[clap(allow_hyphen_values = true)] diff --git a/shell/src/builtins/exec.rs b/shell/src/builtins/exec.rs index f20b4c52..366f9e8f 100644 --- a/shell/src/builtins/exec.rs +++ b/shell/src/builtins/exec.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Exec the provided command. #[derive(Parser)] pub(crate) struct ExecCommand { /// Pass given name as zeroth argument to command. diff --git a/shell/src/builtins/exit.rs b/shell/src/builtins/exit.rs index 692c2e81..4247ca2c 100644 --- a/shell/src/builtins/exit.rs +++ b/shell/src/builtins/exit.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Exit the shell. #[derive(Parser)] pub(crate) struct ExitCommand { code: Option, diff --git a/shell/src/builtins/export.rs b/shell/src/builtins/export.rs index e57a5621..0aef6164 100644 --- a/shell/src/builtins/export.rs +++ b/shell/src/builtins/export.rs @@ -9,6 +9,7 @@ use crate::{ variables, }; +/// Add or update exported shell variables. #[derive(Parser)] pub(crate) struct ExportCommand { #[arg(short = 'f')] diff --git a/shell/src/builtins/false_.rs b/shell/src/builtins/false_.rs index 72b657d6..f5e0ae45 100644 --- a/shell/src/builtins/false_.rs +++ b/shell/src/builtins/false_.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Return a non-zero exit code. #[derive(Parser)] pub(crate) struct FalseCommand {} diff --git a/shell/src/builtins/fg.rs b/shell/src/builtins/fg.rs index 6fb1d262..5a6d5d09 100644 --- a/shell/src/builtins/fg.rs +++ b/shell/src/builtins/fg.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Move a specified job to the foreground. #[derive(Parser)] pub(crate) struct FgCommand { job_spec: Option, diff --git a/shell/src/builtins/getopts.rs b/shell/src/builtins/getopts.rs index 1e348189..038e253b 100644 --- a/shell/src/builtins/getopts.rs +++ b/shell/src/builtins/getopts.rs @@ -7,6 +7,7 @@ use crate::{ variables, }; +/// Parse command options. #[derive(Parser)] pub(crate) struct GetOptsCommand { /// Specification for options diff --git a/shell/src/builtins/help.rs b/shell/src/builtins/help.rs index 36ffbe27..9dd0b8d8 100644 --- a/shell/src/builtins/help.rs +++ b/shell/src/builtins/help.rs @@ -1,8 +1,12 @@ -use crate::builtin::{BuiltinCommand, BuiltinExitCode, BuiltinRegistration}; +use crate::{ + builtin::{self, BuiltinCommand, BuiltinExitCode, BuiltinRegistration}, + context, +}; use clap::Parser; use itertools::Itertools; use std::io::Write; +/// Display command help. #[derive(Parser)] pub(crate) struct HelpCommand { #[arg(short = 'd')] @@ -50,12 +54,7 @@ impl HelpCommand { "The following commands are implemented as shell built-ins:" )?; - let builtins: Vec<(&String, &BuiltinRegistration)> = context - .shell - .builtins - .iter() - .sorted_by_key(|(name, _)| *name) - .collect(); + let builtins = get_builtins_sorted_by_name(context); let items_per_column = (builtins.len() + COLUMN_COUNT - 1) / COLUMN_COUNT; for i in 0..items_per_column { @@ -79,9 +78,13 @@ impl HelpCommand { let pattern = crate::patterns::Pattern::from(topic_pattern); let mut found_count = 0; - for (builtin_name, builtin_registration) in &context.shell.builtins { + for (builtin_name, builtin_registration) in get_builtins_sorted_by_name(context) { if pattern.exactly_matches(builtin_name.as_str(), false)? { - self.display_help_for_builtin(context, builtin_registration)?; + self.display_help_for_builtin( + context, + builtin_name.as_str(), + builtin_registration, + )?; found_count += 1; } } @@ -93,13 +96,34 @@ impl HelpCommand { Ok(()) } - #[allow(clippy::unused_self)] fn display_help_for_builtin( &self, context: &crate::context::CommandExecutionContext<'_>, + name: &str, registration: &BuiltinRegistration, ) -> Result<(), crate::error::Error> { - writeln!(context.stdout(), "{}", (registration.help_func)())?; + let content_type = if self.short_description { + builtin::BuiltinContentType::ShortDescription + } else if self.short_usage { + builtin::BuiltinContentType::ShortUsage + } else { + builtin::BuiltinContentType::DetailedHelp + }; + + let content = (registration.content_func)(name, content_type); + + write!(context.stdout(), "{content}")?; Ok(()) } } + +fn get_builtins_sorted_by_name<'a>( + context: &'a context::CommandExecutionContext<'_>, +) -> Vec<(&'a String, &'a BuiltinRegistration)> { + context + .shell + .builtins + .iter() + .sorted_by_key(|(name, _)| *name) + .collect() +} diff --git a/shell/src/builtins/jobs.rs b/shell/src/builtins/jobs.rs index a39d606d..f9f918e6 100644 --- a/shell/src/builtins/jobs.rs +++ b/shell/src/builtins/jobs.rs @@ -4,6 +4,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use crate::error; +/// Manage jobs. #[derive(Parser)] pub(crate) struct JobsCommand { #[arg(short = 'l')] diff --git a/shell/src/builtins/kill.rs b/shell/src/builtins/kill.rs index ba83d47e..3c04c686 100644 --- a/shell/src/builtins/kill.rs +++ b/shell/src/builtins/kill.rs @@ -6,6 +6,7 @@ use crate::{ error, }; +/// Signal a job or process. #[derive(Parser)] pub(crate) struct KillCommand { #[arg(short = 's')] diff --git a/shell/src/builtins/let_.rs b/shell/src/builtins/let_.rs index 70fb55ee..d354a26e 100644 --- a/shell/src/builtins/let_.rs +++ b/shell/src/builtins/let_.rs @@ -6,6 +6,7 @@ use crate::{ builtin::{BuiltinCommand, BuiltinExitCode}, }; +/// Evalute arithmetic expressions. #[derive(Parser)] pub(crate) struct LetCommand { #[arg(trailing_var_arg = true, allow_hyphen_values = true)] diff --git a/shell/src/builtins/mod.rs b/shell/src/builtins/mod.rs index c86ad9b1..335dc9d3 100644 --- a/shell/src/builtins/mod.rs +++ b/shell/src/builtins/mod.rs @@ -11,12 +11,12 @@ use crate::error; mod alias; mod bg; -mod brea; +mod break_; mod builtin_; mod cd; mod colon; mod complete; -mod continu; +mod continue_; mod declare; mod dirs; mod dot; @@ -40,7 +40,7 @@ mod printf; mod pushd; mod pwd; mod read; -mod retur; +mod return_; mod set; mod shift; mod shopt; @@ -57,7 +57,7 @@ mod wait; fn builtin() -> BuiltinRegistration { BuiltinRegistration { execute_func: exec_builtin::, - help_func: get_builtin_help::, + content_func: get_builtin_content::, disabled: false, special_builtin: false, declaration_builtin: false, @@ -67,7 +67,7 @@ fn builtin() -> BuiltinRegistration { fn special_builtin() -> BuiltinRegistration { BuiltinRegistration { execute_func: exec_builtin::, - help_func: get_builtin_help::, + content_func: get_builtin_content::, disabled: false, special_builtin: true, declaration_builtin: false, @@ -77,7 +77,7 @@ fn special_builtin() -> BuiltinRegistration { fn decl_builtin() -> BuiltinRegistration { BuiltinRegistration { execute_func: exec_declaration_builtin::, - help_func: get_builtin_help::, + content_func: get_builtin_content::, disabled: false, special_builtin: false, declaration_builtin: true, @@ -88,15 +88,18 @@ fn decl_builtin() -> BuiltinRegistration { fn special_decl_builtin() -> BuiltinRegistration { BuiltinRegistration { execute_func: exec_declaration_builtin::, - help_func: get_builtin_help::, + content_func: get_builtin_content::, disabled: false, special_builtin: true, declaration_builtin: true, } } -fn get_builtin_help() -> String { - T::get_long_help() +fn get_builtin_content( + name: &str, + content_type: builtin::BuiltinContentType, +) -> String { + T::get_content(name, content_type) } fn exec_builtin( @@ -185,11 +188,11 @@ pub(crate) fn get_default_builtins( // should be a special built-in. // - m.insert("break".into(), special_builtin::()); + m.insert("break".into(), special_builtin::()); m.insert(":".into(), special_builtin::()); m.insert( "continue".into(), - special_builtin::(), + special_builtin::(), ); m.insert(".".into(), special_builtin::()); m.insert("eval".into(), special_builtin::()); @@ -200,7 +203,7 @@ pub(crate) fn get_default_builtins( "export".into(), special_decl_builtin::(), ); - m.insert("return".into(), special_builtin::()); + m.insert("return".into(), special_builtin::()); m.insert("set".into(), special_builtin::()); m.insert("shift".into(), special_builtin::()); m.insert("trap".into(), special_builtin::()); diff --git a/shell/src/builtins/popd.rs b/shell/src/builtins/popd.rs index e5bfc987..6859a7cb 100644 --- a/shell/src/builtins/popd.rs +++ b/shell/src/builtins/popd.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Pop a path from the current directory stack. #[derive(Parser)] pub(crate) struct PopdCommand { #[clap(short = 'n')] diff --git a/shell/src/builtins/printf.rs b/shell/src/builtins/printf.rs index d497a583..28c1d0ea 100644 --- a/shell/src/builtins/printf.rs +++ b/shell/src/builtins/printf.rs @@ -6,6 +6,7 @@ use crate::{ expansion, }; +/// Format a string. #[derive(Parser)] #[clap(disable_help_flag = true, disable_version_flag = true)] pub(crate) struct PrintfCommand { diff --git a/shell/src/builtins/pushd.rs b/shell/src/builtins/pushd.rs index 30ffcd1f..52dec183 100644 --- a/shell/src/builtins/pushd.rs +++ b/shell/src/builtins/pushd.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Push a path onto the current directory stack. #[derive(Parser)] pub(crate) struct PushdCommand { #[clap(short = 'n')] diff --git a/shell/src/builtins/pwd.rs b/shell/src/builtins/pwd.rs index 3896276a..fbd3702e 100644 --- a/shell/src/builtins/pwd.rs +++ b/shell/src/builtins/pwd.rs @@ -2,6 +2,7 @@ use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use clap::Parser; use std::io::Write; +/// Display the current working directory. #[derive(Parser)] pub(crate) struct PwdCommand { #[arg( diff --git a/shell/src/builtins/read.rs b/shell/src/builtins/read.rs index d99cec9d..44d24257 100644 --- a/shell/src/builtins/read.rs +++ b/shell/src/builtins/read.rs @@ -3,6 +3,7 @@ use std::{collections::VecDeque, io::Read}; use crate::{builtin::BuiltinCommand, env, error, openfiles, variables}; +/// Parse standard input. #[derive(Parser)] pub(crate) struct ReadCommand { #[clap(short = 'a')] diff --git a/shell/src/builtins/retur.rs b/shell/src/builtins/return_.rs similarity index 95% rename from shell/src/builtins/retur.rs rename to shell/src/builtins/return_.rs index 8d07d50a..cc0cb521 100644 --- a/shell/src/builtins/retur.rs +++ b/shell/src/builtins/return_.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Return from the current function. #[derive(Parser)] pub(crate) struct ReturnCommand { code: Option, diff --git a/shell/src/builtins/set.rs b/shell/src/builtins/set.rs index 985e22e7..5526cbb8 100644 --- a/shell/src/builtins/set.rs +++ b/shell/src/builtins/set.rs @@ -77,6 +77,7 @@ pub(crate) struct SetOption { disable: Vec, } +/// Manage set-based shell options. #[derive(Parser)] #[clap(disable_help_flag = true)] pub(crate) struct SetCommand { diff --git a/shell/src/builtins/shift.rs b/shell/src/builtins/shift.rs index 44677415..8dab6fae 100644 --- a/shell/src/builtins/shift.rs +++ b/shell/src/builtins/shift.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Shift positional arguments. #[derive(Parser)] pub(crate) struct ShiftCommand { n: Option, diff --git a/shell/src/builtins/shopt.rs b/shell/src/builtins/shopt.rs index ce04a491..7f911b79 100644 --- a/shell/src/builtins/shopt.rs +++ b/shell/src/builtins/shopt.rs @@ -4,6 +4,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Manage shopt-style options. #[derive(Parser)] pub(crate) struct ShoptCommand { #[arg(short = 'o')] diff --git a/shell/src/builtins/test.rs b/shell/src/builtins/test.rs index 0f26a3d4..05a65368 100644 --- a/shell/src/builtins/test.rs +++ b/shell/src/builtins/test.rs @@ -6,6 +6,7 @@ use crate::{ error, tests, Shell, }; +/// Evaluate test expression. #[derive(Parser)] #[clap(disable_help_flag = true, disable_version_flag = true)] pub(crate) struct TestCommand { diff --git a/shell/src/builtins/trap.rs b/shell/src/builtins/trap.rs index cc300b25..fb97d435 100644 --- a/shell/src/builtins/trap.rs +++ b/shell/src/builtins/trap.rs @@ -6,6 +6,7 @@ use crate::{ error, traps, }; +/// Manage signal traps. #[derive(Parser)] pub(crate) struct TrapCommand { #[arg(short = 'l')] diff --git a/shell/src/builtins/true_.rs b/shell/src/builtins/true_.rs index 140e444b..fddd21bc 100644 --- a/shell/src/builtins/true_.rs +++ b/shell/src/builtins/true_.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Return 0. #[derive(Parser)] pub(crate) struct TrueCommand {} diff --git a/shell/src/builtins/type_.rs b/shell/src/builtins/type_.rs index 17f5e3f9..fc96c546 100644 --- a/shell/src/builtins/type_.rs +++ b/shell/src/builtins/type_.rs @@ -10,6 +10,7 @@ use crate::{ Shell, }; +/// Inspect the type of a named shell item. #[derive(Parser)] pub(crate) struct TypeCommand { #[arg(short = 'a')] diff --git a/shell/src/builtins/umask.rs b/shell/src/builtins/umask.rs index f6763a02..406c92e5 100644 --- a/shell/src/builtins/umask.rs +++ b/shell/src/builtins/umask.rs @@ -2,6 +2,7 @@ use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use clap::Parser; use std::io::Write; +/// Manage the process umask. #[derive(Parser)] pub(crate) struct UmaskCommand { #[arg( diff --git a/shell/src/builtins/unalias.rs b/shell/src/builtins/unalias.rs index 38287c01..c50fd4e0 100644 --- a/shell/src/builtins/unalias.rs +++ b/shell/src/builtins/unalias.rs @@ -3,6 +3,7 @@ use std::io::Write; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Unset a shell alias. #[derive(Parser)] pub(crate) struct UnaliasCommand { #[arg(short = 'a')] diff --git a/shell/src/builtins/unimp.rs b/shell/src/builtins/unimp.rs index 735b522a..e75c78a4 100644 --- a/shell/src/builtins/unimp.rs +++ b/shell/src/builtins/unimp.rs @@ -6,6 +6,7 @@ use std::io::Write; use clap::Parser; +/// (UNIMPLEMENTED COMMAND) #[derive(Parser)] pub(crate) struct UnimplementedCommand { #[clap(allow_hyphen_values = true)] diff --git a/shell/src/builtins/unset.rs b/shell/src/builtins/unset.rs index f94b0ea9..5cb59971 100644 --- a/shell/src/builtins/unset.rs +++ b/shell/src/builtins/unset.rs @@ -2,6 +2,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; +/// Unset a variable. #[derive(Parser)] pub(crate) struct UnsetCommand { #[clap(flatten)] diff --git a/shell/src/builtins/wait.rs b/shell/src/builtins/wait.rs index e248bdf1..bbb8da63 100644 --- a/shell/src/builtins/wait.rs +++ b/shell/src/builtins/wait.rs @@ -3,6 +3,7 @@ use clap::Parser; use crate::builtin::{BuiltinCommand, BuiltinExitCode}; use crate::error; +/// Wait for jobs to terminate. #[derive(Parser)] pub(crate) struct WaitCommand { #[arg(short = 'f')] diff --git a/shell/src/completion.rs b/shell/src/completion.rs index fbac6900..b5cbaca4 100644 --- a/shell/src/completion.rs +++ b/shell/src/completion.rs @@ -522,7 +522,6 @@ impl CompletionConfig { } } - #[allow(clippy::unused_self)] async fn get_completions_for_token<'a>( &self, shell: &mut Shell, diff --git a/shell/src/variables.rs b/shell/src/variables.rs index 211284e8..cbf38026 100644 --- a/shell/src/variables.rs +++ b/shell/src/variables.rs @@ -281,7 +281,6 @@ impl ShellVariable { } } - #[allow(clippy::unused_self)] #[allow(clippy::needless_pass_by_value)] pub fn assign_at_index( &mut self,