brush_builtins/
lib.rs

1//! Standard builtins.
2
3#[cfg(feature = "builtin.alias")]
4mod alias;
5#[cfg(feature = "builtin.bg")]
6mod bg;
7#[cfg(feature = "builtin.bind")]
8mod bind;
9#[cfg(feature = "builtin.break")]
10mod break_;
11#[cfg(feature = "builtin.brushinfo")]
12mod brushinfo;
13#[cfg(feature = "builtin.builtin")]
14mod builtin_;
15#[cfg(feature = "builtin.cd")]
16mod cd;
17#[cfg(feature = "builtin.colon")]
18mod colon;
19#[cfg(feature = "builtin.command")]
20mod command;
21#[cfg(any(
22    feature = "builtin.complete",
23    feature = "builtin.compgen",
24    feature = "builtin.compopt"
25))]
26mod complete;
27#[cfg(feature = "builtin.continue")]
28mod continue_;
29#[cfg(feature = "builtin.declare")]
30mod declare;
31#[cfg(feature = "builtin.dirs")]
32mod dirs;
33#[cfg(feature = "builtin.dot")]
34mod dot;
35#[cfg(feature = "builtin.echo")]
36mod echo;
37#[cfg(feature = "builtin.enable")]
38mod enable;
39#[cfg(feature = "builtin.eval")]
40mod eval;
41#[cfg(all(feature = "builtin.exec", unix))]
42mod exec;
43#[cfg(feature = "builtin.exit")]
44mod exit;
45#[cfg(feature = "builtin.export")]
46mod export;
47#[cfg(feature = "builtin.false")]
48mod false_;
49#[cfg(feature = "builtin.fc")]
50mod fc;
51#[cfg(feature = "builtin.fg")]
52mod fg;
53#[cfg(feature = "builtin.getopts")]
54mod getopts;
55#[cfg(feature = "builtin.hash")]
56mod hash;
57#[cfg(feature = "builtin.help")]
58mod help;
59#[cfg(feature = "builtin.history")]
60mod history;
61#[cfg(feature = "builtin.jobs")]
62mod jobs;
63#[cfg(all(feature = "builtin.kill", unix))]
64mod kill;
65#[cfg(feature = "builtin.let")]
66mod let_;
67#[cfg(feature = "builtin.mapfile")]
68mod mapfile;
69#[cfg(feature = "builtin.popd")]
70mod popd;
71#[cfg(all(feature = "builtin.printf", any(unix, windows)))]
72mod printf;
73#[cfg(feature = "builtin.pushd")]
74mod pushd;
75#[cfg(feature = "builtin.pwd")]
76mod pwd;
77#[cfg(feature = "builtin.read")]
78mod read;
79#[cfg(feature = "builtin.return")]
80mod return_;
81#[cfg(feature = "builtin.set")]
82mod set;
83#[cfg(feature = "builtin.shift")]
84mod shift;
85#[cfg(feature = "builtin.shopt")]
86mod shopt;
87#[cfg(all(feature = "builtin.suspend", unix))]
88mod suspend;
89#[cfg(feature = "builtin.test")]
90mod test;
91#[cfg(feature = "builtin.times")]
92mod times;
93#[cfg(feature = "builtin.trap")]
94mod trap;
95#[cfg(feature = "builtin.true")]
96mod true_;
97#[cfg(feature = "builtin.type")]
98mod type_;
99#[cfg(all(feature = "builtin.ulimit", unix))]
100mod ulimit;
101#[cfg(all(feature = "builtin.umask", unix))]
102mod umask;
103#[cfg(feature = "builtin.unalias")]
104mod unalias;
105#[cfg(feature = "builtin.unset")]
106mod unset;
107#[cfg(feature = "builtin.wait")]
108mod wait;
109
110mod builder;
111mod factory;
112mod unimp;
113
114pub use builder::ShellBuilderExt;
115pub use factory::{BuiltinSet, default_builtins};
116
117/// Macro to define a struct that represents a shell built-in flag argument that can be
118/// enabled or disabled by specifying an option with a leading '+' or '-' character.
119///
120/// # Arguments
121///
122/// - `$struct_name` - The identifier to be used for the struct to define.
123/// - `$flag_char` - The character to use as the flag.
124/// - `$desc` - The string description of the flag.
125#[macro_export]
126macro_rules! minus_or_plus_flag_arg {
127    ($struct_name:ident, $flag_char:literal, $desc:literal) => {
128        #[derive(clap::Parser)]
129        pub(crate) struct $struct_name {
130            #[arg(short = $flag_char, name = concat!(stringify!($struct_name), "_enable"), action = clap::ArgAction::SetTrue, help = $desc)]
131            _enable: bool,
132            #[arg(long = concat!("+", $flag_char), name = concat!(stringify!($struct_name), "_disable"), action = clap::ArgAction::SetTrue, hide = true)]
133            _disable: bool,
134        }
135
136        impl From<$struct_name> for Option<bool> {
137            fn from(value: $struct_name) -> Self {
138                value.to_bool()
139            }
140        }
141
142        impl $struct_name {
143            #[allow(dead_code, reason = "may not be used in all macro instantiations")]
144            pub const fn is_some(&self) -> bool {
145                self._enable || self._disable
146            }
147
148            pub const fn to_bool(&self) -> Option<bool> {
149                match (self._enable, self._disable) {
150                    (true, false) => Some(true),
151                    (false, true) => Some(false),
152                    _ => None,
153                }
154            }
155        }
156    };
157}