Skip to content

Commit 16e1c5c

Browse files
committed
refactor(builtins): migrate base64 from manual arg parsing to ArgParser
Replace manual `while i < ctx.args.len()` index management with ArgParser API in the base64 builtin. Uses flag_any, flag_value, positional, and is_flag for cleaner argument handling. Part of #880
1 parent 2928e36 commit 16e1c5c

File tree

1 file changed

+24
-26
lines changed

1 file changed

+24
-26
lines changed

crates/bashkit/src/builtins/base64.rs

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use async_trait::async_trait;
44
use base64::Engine;
55

6+
use super::arg_parser::ArgParser;
67
use super::{Builtin, Context, read_text_file};
78
use crate::error::Result;
89
use crate::interpreter::ExecResult;
@@ -23,35 +24,32 @@ impl Builtin for Base64 {
2324
let mut wrap = 76usize;
2425
let mut file: Option<String> = None;
2526

26-
let mut i = 0;
27-
while i < ctx.args.len() {
28-
match ctx.args[i].as_str() {
29-
"-d" | "--decode" => decode = true,
30-
"-w" => {
31-
i += 1;
32-
if i >= ctx.args.len() {
33-
return Ok(ExecResult::err(
34-
"base64: option requires an argument -- 'w'\n".to_string(),
35-
1,
36-
));
37-
}
38-
wrap = ctx.args[i].parse().unwrap_or(76);
39-
}
40-
s if s.starts_with("--wrap=") => {
41-
wrap = s[7..].parse().unwrap_or(76);
42-
}
43-
"-i" | "--ignore-garbage" => { /* silently accept */ }
44-
s if s.starts_with('-') && s != "-" => {
45-
return Ok(ExecResult::err(
46-
format!("base64: invalid option -- '{}'\n", &s[1..]),
47-
1,
48-
));
27+
let mut parser = ArgParser::new(ctx.args);
28+
while !parser.is_done() {
29+
if parser.flag_any(&["-d", "--decode"]) {
30+
decode = true;
31+
} else if parser
32+
.current()
33+
.is_some_and(|s| s.starts_with("--wrap="))
34+
{
35+
if let Some(s) = parser.positional() {
36+
wrap = s["--wrap=".len()..].parse().unwrap_or(76);
4937
}
50-
_ => {
51-
file = Some(ctx.args[i].clone());
38+
} else if let Some(val) = match parser.flag_value("-w", "base64") {
39+
Ok(v) => v,
40+
Err(e) => return Ok(ExecResult::err(format!("{e}\n"), 1)),
41+
} {
42+
wrap = val.parse().unwrap_or(76);
43+
} else if parser.flag_any(&["-i", "--ignore-garbage"]) {
44+
// silently accept
45+
} else if parser.is_flag() {
46+
if let Some(s) = parser.positional() {
47+
let msg = format!("base64: invalid option -- '{}'\n", &s[1..]);
48+
return Ok(ExecResult::err(msg, 1));
5249
}
50+
} else if let Some(arg) = parser.positional() {
51+
file = Some(arg.to_string());
5352
}
54-
i += 1;
5553
}
5654

5755
// Get input: from file, stdin, or empty

0 commit comments

Comments
 (0)