Skip to content

Commit

Permalink
perf: simplify colon command
Browse files Browse the repository at this point in the history
  • Loading branch information
reubeno committed Jan 9, 2025
1 parent 28a1e63 commit 020f956
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 57 deletions.
11 changes: 11 additions & 0 deletions brush-core/src/builtins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,17 @@ pub struct Registration {
pub declaration_builtin: bool,
}

impl Registration {
/// Updates the given registration to mark it for a special builtin.
#[must_use]
pub fn special(self) -> Self {
Self {
special_builtin: true,
..self
}
}
}

fn get_builtin_man_page(_name: &str, _command: &clap::Command) -> Result<String, error::Error> {
error::unimp("man page rendering is not yet implemented")
}
Expand Down
37 changes: 23 additions & 14 deletions brush-core/src/builtins/colon.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
use clap::Parser;

use crate::{builtins, commands};
use crate::{builtins, commands, error};

/// No-op command.
#[derive(Parser)]
#[clap(disable_help_flag = true, disable_version_flag = true)]
pub(crate) struct ColonCommand {
#[clap(allow_hyphen_values = true)]
args: Vec<String>,
}
pub(crate) struct ColonCommand {}

impl builtins::SimpleCommand for ColonCommand {
fn get_content(
_name: &str,
content_type: builtins::ContentType,
) -> Result<String, crate::error::Error> {
match content_type {
builtins::ContentType::DetailedHelp => {
Ok("Null command; always returns success.".into())
}
builtins::ContentType::ShortUsage => Ok(":: :".into()),
builtins::ContentType::ShortDescription => Ok(": - Null command".into()),
builtins::ContentType::ManPage => error::unimp("man page not yet implemented"),
}
}

impl builtins::Command for ColonCommand {
async fn execute(
&self,
fn execute(
_context: commands::ExecutionContext<'_>,
) -> Result<crate::builtins::ExitCode, crate::error::Error> {
Ok(builtins::ExitCode::Success)
_args: &[&str],
) -> Result<builtins::BuiltinResult, crate::error::Error> {
Ok(builtins::BuiltinResult {
exit_code: builtins::ExitCode::Success,
})
}
}
58 changes: 22 additions & 36 deletions brush-core/src/builtins/factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,6 @@ pub fn builtin<B: builtins::Command + Send + Sync>() -> builtins::Registration {
}
}

fn special_builtin<B: builtins::Command + Send + Sync>() -> builtins::Registration {
builtins::Registration {
execute_func: exec_builtin::<B>,
content_func: get_builtin_content::<B>,
disabled: false,
special_builtin: true,
declaration_builtin: false,
}
}

fn decl_builtin<B: builtins::DeclarationCommand + Send + Sync>() -> builtins::Registration {
builtins::Registration {
execute_func: exec_declaration_builtin::<B>,
Expand All @@ -66,16 +56,6 @@ fn decl_builtin<B: builtins::DeclarationCommand + Send + Sync>() -> builtins::Re
}
}

fn special_decl_builtin<B: builtins::DeclarationCommand + Send + Sync>() -> builtins::Registration {
builtins::Registration {
execute_func: exec_declaration_builtin::<B>,
content_func: get_builtin_content::<B>,
disabled: false,
special_builtin: true,
declaration_builtin: true,
}
}

fn get_builtin_content<T: builtins::Command + Send + Sync>(
name: &str,
content_type: builtins::ContentType,
Expand Down Expand Up @@ -194,32 +174,38 @@ pub(crate) fn get_default_builtins(
// should be a special built-in.
//

m.insert("break".into(), special_builtin::<break_::BreakCommand>());
m.insert(":".into(), special_builtin::<colon::ColonCommand>());
m.insert("break".into(), builtin::<break_::BreakCommand>().special());
m.insert(
":".into(),
simple_builtin::<colon::ColonCommand>().special(),
);
m.insert(
"continue".into(),
special_builtin::<continue_::ContinueCommand>(),
builtin::<continue_::ContinueCommand>().special(),
);
m.insert(".".into(), special_builtin::<dot::DotCommand>());
m.insert("eval".into(), special_builtin::<eval::EvalCommand>());
m.insert(".".into(), builtin::<dot::DotCommand>().special());
m.insert("eval".into(), builtin::<eval::EvalCommand>().special());
#[cfg(unix)]
m.insert("exec".into(), special_builtin::<exec::ExecCommand>());
m.insert("exit".into(), special_builtin::<exit::ExitCommand>());
m.insert("exec".into(), builtin::<exec::ExecCommand>().special());
m.insert("exit".into(), builtin::<exit::ExitCommand>().special());
m.insert(
"export".into(),
special_decl_builtin::<export::ExportCommand>(),
decl_builtin::<export::ExportCommand>().special(),
);
m.insert(
"return".into(),
builtin::<return_::ReturnCommand>().special(),
);
m.insert("return".into(), special_builtin::<return_::ReturnCommand>());
m.insert("set".into(), special_builtin::<set::SetCommand>());
m.insert("shift".into(), special_builtin::<shift::ShiftCommand>());
m.insert("trap".into(), special_builtin::<trap::TrapCommand>());
m.insert("unset".into(), special_builtin::<unset::UnsetCommand>());
m.insert("set".into(), builtin::<set::SetCommand>().special());
m.insert("shift".into(), builtin::<shift::ShiftCommand>().special());
m.insert("trap".into(), builtin::<trap::TrapCommand>().special());
m.insert("unset".into(), builtin::<unset::UnsetCommand>().special());

m.insert(
"readonly".into(),
special_decl_builtin::<declare::DeclareCommand>(),
decl_builtin::<declare::DeclareCommand>().special(),
);
m.insert("times".into(), special_builtin::<times::TimesCommand>());
m.insert("times".into(), builtin::<times::TimesCommand>().special());

//
// Non-special builtins
Expand Down Expand Up @@ -260,7 +246,7 @@ pub(crate) fn get_default_builtins(
m.insert("mapfile".into(), builtin::<mapfile::MapFileCommand>());
m.insert("printf".into(), builtin::<printf::PrintfCommand>());
m.insert("shopt".into(), builtin::<shopt::ShoptCommand>());
m.insert("source".into(), special_builtin::<dot::DotCommand>());
m.insert("source".into(), builtin::<dot::DotCommand>().special());
#[cfg(unix)]
m.insert("suspend".into(), builtin::<suspend::SuspendCommand>());
m.insert("test".into(), builtin::<test::TestCommand>());
Expand Down
14 changes: 7 additions & 7 deletions brush-core/src/sys/unix/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,37 +15,37 @@ impl crate::sys::fs::PathExt for Path {
}

fn exists_and_is_block_device(&self) -> bool {
try_get_file_type(self).map_or(false, |ft| ft.is_block_device())
try_get_file_type(self).is_some_and(|ft| ft.is_block_device())
}

fn exists_and_is_char_device(&self) -> bool {
try_get_file_type(self).map_or(false, |ft| ft.is_char_device())
try_get_file_type(self).is_some_and(|ft| ft.is_char_device())
}

fn exists_and_is_fifo(&self) -> bool {
try_get_file_type(self).map_or(false, |ft: std::fs::FileType| ft.is_fifo())
try_get_file_type(self).is_some_and(|ft: std::fs::FileType| ft.is_fifo())
}

fn exists_and_is_socket(&self) -> bool {
try_get_file_type(self).map_or(false, |ft| ft.is_socket())
try_get_file_type(self).is_some_and(|ft| ft.is_socket())
}

fn exists_and_is_setgid(&self) -> bool {
const S_ISGID: u32 = 0o2000;
let file_mode = try_get_file_mode(self);
file_mode.map_or(false, |mode| mode & S_ISGID != 0)
file_mode.is_some_and(|mode| mode & S_ISGID != 0)
}

fn exists_and_is_setuid(&self) -> bool {
const S_ISUID: u32 = 0o4000;
let file_mode = try_get_file_mode(self);
file_mode.map_or(false, |mode| mode & S_ISUID != 0)
file_mode.is_some_and(|mode| mode & S_ISUID != 0)
}

fn exists_and_is_sticky_bit(&self) -> bool {
const S_ISVTX: u32 = 0o1000;
let file_mode = try_get_file_mode(self);
file_mode.map_or(false, |mode| mode & S_ISVTX != 0)
file_mode.is_some_and(|mode| mode & S_ISVTX != 0)
}
}

Expand Down

0 comments on commit 020f956

Please sign in to comment.