diff --git a/src/builtins/exists.rs b/src/builtins/exists.rs index eab328d55684d8aab136fdaf130ee9f632467ea6..d7d6c06f8ab27d427364bf6ce1b8a62eb75a31fa 100644 --- a/src/builtins/exists.rs +++ b/src/builtins/exists.rs @@ -118,9 +118,7 @@ fn file_has_execute_permission(filepath: &str) -> bool { } /// Returns true if the string is not empty -fn string_is_nonzero(string: &str) -> bool { - !string.is_empty() -} +fn string_is_nonzero(string: &str) -> bool { !string.is_empty() } /// Returns true if the variable is an array and the array is not empty fn array_var_is_not_empty(arrayvar: &str, shell: &Shell) -> bool { diff --git a/src/builtins/job_control.rs b/src/builtins/job_control.rs index 9b470d9f24b566313a72f502a2c4ca4e6c0be3d1..9d409e34ea5a5aa67e4738e960ca4781e230a529 100644 --- a/src/builtins/job_control.rs +++ b/src/builtins/job_control.rs @@ -26,9 +26,10 @@ pub(crate) fn disown(shell: &mut Shell, args: &[&str]) -> Result<(), String> { "-h" => flags |= NO_SIGHUP, "-r" => flags |= RUN_JOBS, _ => { - let jobspec = arg.parse::<u32>().map_err(|_| format!("invalid jobspec: '{}'", arg))?; + let jobspec = arg.parse::<u32>() + .map_err(|_| format!("invalid jobspec: '{}'", arg))?; collected_jobs.push(jobspec); - }, + } } } @@ -42,9 +43,13 @@ pub(crate) fn disown(shell: &mut Shell, args: &[&str]) -> Result<(), String> { let mut process_table = shell.background.lock().unwrap(); if collected_jobs.is_empty() && flags & ALL_JOBS != 0 { if flags & NO_SIGHUP != 0 { - process_table.iter_mut().for_each(|process| process.ignore_sighup = true); + process_table + .iter_mut() + .for_each(|process| process.ignore_sighup = true); } else { - process_table.iter_mut().for_each(|process| process.state = ProcessState::Empty); + process_table + .iter_mut() + .for_each(|process| process.state = ProcessState::Empty); } } else { collected_jobs.sort(); @@ -80,7 +85,10 @@ pub(crate) fn disown(shell: &mut Shell, args: &[&str]) -> Result<(), String> { pub(crate) fn jobs(shell: &mut Shell) { for (id, process) in shell.background.lock().unwrap().iter().enumerate() { if process.state != ProcessState::Empty { - eprintln!("[{}] {} {}\t{}", id, process.pid, process.state, process.name); + eprintln!( + "[{}] {} {}\t{}", + id, process.pid, process.state, process.name + ); } } } @@ -90,7 +98,9 @@ pub(crate) fn jobs(shell: &mut Shell) { /// If multiple jobs are given, then only the last job's exit status will be returned. pub(crate) fn fg(shell: &mut Shell, args: &[&str]) -> i32 { fn fg_job(shell: &mut Shell, njob: u32) -> i32 { - let job = if let Some(borrowed_job) = shell.background.lock().unwrap().iter().nth(njob as usize) { + let job = if let Some(borrowed_job) = + shell.background.lock().unwrap().iter().nth(njob as usize) + { borrowed_job.clone() } else { eprintln!("ion: fg: job {} does not exist", njob); diff --git a/src/builtins/man_pages.rs b/src/builtins/man_pages.rs index 7aa8740933d469991d8dd090d7adec6a795718f3..135d598f22007fd7c2b81c27c6b3814171e6050f 100644 --- a/src/builtins/man_pages.rs +++ b/src/builtins/man_pages.rs @@ -212,7 +212,6 @@ OPTIONS -c Execute command with an empty environment. "#; - pub(crate) const MAN_HISTORY: &'static str = r#"NAME history - print command history diff --git a/src/builtins/mod.rs b/src/builtins/mod.rs index 4cffe500d6332ea95d71ee1f6cd88e40682c291f..f6f2f82a2c074aebe65a10fc6f9d3fe318d4d395 100644 --- a/src/builtins/mod.rs +++ b/src/builtins/mod.rs @@ -123,8 +123,8 @@ pub struct Builtin { } pub struct BuiltinMap { - pub(crate) name: &'static [&'static str], - pub(crate) help: &'static [&'static str], + pub(crate) name: &'static [&'static str], + pub(crate) help: &'static [&'static str], pub(crate) functions: &'static [BuiltinFunction], } @@ -139,13 +139,9 @@ impl BuiltinMap { }) } - pub fn keys(&self) -> &'static [&'static str] { - self.name - } + pub fn keys(&self) -> &'static [&'static str] { self.name } - pub fn contains_key(&self, func: &str) -> bool { - self.name.iter().any(|&name| name == func) - } + pub fn contains_key(&self, func: &str) -> bool { self.name.iter().any(|&name| name == func) } } // Definitions of simple builtins go here @@ -267,9 +263,7 @@ fn builtin_unalias(args: &[&str], shell: &mut Shell) -> i32 { // TODO There is a man page for fn however the -h and --help flags are not // checked for. -fn builtin_fn(_: &[&str], shell: &mut Shell) -> i32 { - fn_(&mut shell.functions) -} +fn builtin_fn(_: &[&str], shell: &mut Shell) -> i32 { fn_(&mut shell.functions) } fn builtin_read(args: &[&str], shell: &mut Shell) -> i32 { if check_help(args, MAN_READ) { diff --git a/src/builtins/set.rs b/src/builtins/set.rs index e97fe16f54547e0d103167ca91326dbaa15a0748..e0405f3e8a460e1382c5e30fd2b4752b69ae22bd 100644 --- a/src/builtins/set.rs +++ b/src/builtins/set.rs @@ -32,10 +32,10 @@ pub(crate) fn set(args: &[&str], shell: &mut Shell) -> i32 { b'o' => match args_iter.next() { Some(&"vi") => if let Some(context) = shell.context.as_mut() { context.key_bindings = KeyBindings::Vi; - } + }, Some(&"emacs") => if let Some(context) = shell.context.as_mut() { context.key_bindings = KeyBindings::Emacs; - } + }, Some(&"huponexit") => shell.flags |= HUPONEXIT, Some(_) => { eprintln!("ion: set: invalid option"); @@ -65,7 +65,7 @@ pub(crate) fn set(args: &[&str], shell: &mut Shell) -> i32 { eprintln!("ion: set: no option given"); return 0; } - } + }, _ => return 0, } } diff --git a/src/builtins/test.rs b/src/builtins/test.rs index 101a79807260607e9b58d3742b153e4d6715078d..0c0a37d583be287e705b5f62c7e3c55128f487ac 100644 --- a/src/builtins/test.rs +++ b/src/builtins/test.rs @@ -221,9 +221,7 @@ fn file_is_character_device(filepath: &str) -> bool { } /// Exits SUCCESS if the file exists -fn file_exists(filepath: &str) -> bool { - Path::new(filepath).exists() -} +fn file_exists(filepath: &str) -> bool { Path::new(filepath).exists() } /// Exits SUCCESS if the file is a regular file fn file_is_regular(filepath: &str) -> bool { @@ -247,14 +245,10 @@ fn file_is_symlink(filepath: &str) -> bool { } /// Exits SUCCESS if the string is not empty -fn string_is_nonzero(string: &str) -> bool { - !string.is_empty() -} +fn string_is_nonzero(string: &str) -> bool { !string.is_empty() } /// Exits SUCCESS if the string is empty -fn string_is_zero(string: &str) -> bool { - string.is_empty() -} +fn string_is_zero(string: &str) -> bool { string.is_empty() } #[test] fn test_strings() { @@ -271,7 +265,6 @@ fn test_empty_str() { assert_eq!(eval(vec!["c", "=", ""]), Ok(false)); } - #[test] fn test_integers_arguments() { // Equal To diff --git a/src/builtins/variables.rs b/src/builtins/variables.rs index e58970f069b4dee45b5b5f9b912cac10fd396d65..2f223df18d652690f146e74301621ab06e706e49 100644 --- a/src/builtins/variables.rs +++ b/src/builtins/variables.rs @@ -134,7 +134,6 @@ pub(crate) fn alias(vars: &mut Variables, args: &str) -> i32 { SUCCESS } - /// Dropping an alias will erase it from the shell. pub(crate) fn drop_alias<I: IntoIterator>(vars: &mut Variables, args: I) -> i32 where @@ -200,7 +199,6 @@ where SUCCESS } - #[cfg(test)] mod test { use super::*; @@ -210,9 +208,7 @@ mod test { struct VariableExpander(pub Variables); impl Expander for VariableExpander { - fn variable(&self, var: &str, _: bool) -> Option<Value> { - self.0.get_var(var) - } + fn variable(&self, var: &str, _: bool) -> Option<Value> { self.0.get_var(var) } } // TODO: Rewrite tests now that let is part of the grammar. diff --git a/src/parser/arguments.rs b/src/parser/arguments.rs index dedee06ac1a4a4d038a18c22e2de713766bc27dc..defce4de0a9288518f7e3be0823e3b44712049d0 100644 --- a/src/parser/arguments.rs +++ b/src/parser/arguments.rs @@ -7,16 +7,16 @@ const METHOD: u8 = 32; /// An efficient `Iterator` structure for splitting arguments pub struct ArgumentSplitter<'a> { - data: &'a str, - read: usize, + data: &'a str, + read: usize, flags: u8, } impl<'a> ArgumentSplitter<'a> { pub fn new(data: &'a str) -> ArgumentSplitter<'a> { ArgumentSplitter { - data: data, - read: 0, + data: data, + read: 0, flags: 0, } } @@ -135,7 +135,6 @@ mod tests { compare(input, expected); } - #[test] fn arrays() { let input = "echo [ one two @[echo three four] five ] [ six seven ]"; diff --git a/src/parser/assignments/actions.rs b/src/parser/assignments/actions.rs index c1bc9175d00df54ecece35cf94b89af6c3225da3..b2f755031f667b9bef69e01db3d52565e2b22511 100644 --- a/src/parser/assignments/actions.rs +++ b/src/parser/assignments/actions.rs @@ -28,11 +28,11 @@ impl<'a> Display for AssignmentError<'a> { /// Each request will tell the shell whether the assignment is asking to update an array or a /// string, and will contain the key/value pair to assign. pub(crate) struct AssignmentActions<'a> { - keys: KeyIterator<'a>, + keys: KeyIterator<'a>, operator: Operator, - values: ArgumentSplitter<'a>, - prevkey: &'a str, - prevval: &'a str, + values: ArgumentSplitter<'a>, + prevkey: &'a str, + prevval: &'a str, } impl<'a> AssignmentActions<'a> { @@ -65,10 +65,9 @@ impl<'a> Iterator for AssignmentActions<'a> { } else { if let Some(_) = self.values.next() { eprintln!( - "ion: extra values were supplied, and thus ignored. Previous \ - assignment: '{}' = '{}'", - self.prevkey, - self.prevval + "ion: extra values were supplied, and thus ignored. Previous assignment: '{}' \ + = '{}'", + self.prevkey, self.prevval ); } None diff --git a/src/parser/assignments/keys.rs b/src/parser/assignments/keys.rs index b12502d724aa2fd895696955b73b64d5c9abc1af..20116dfceaa3ab671b4331b1d8d4505cb942fb73 100644 --- a/src/parser/assignments/keys.rs +++ b/src/parser/assignments/keys.rs @@ -16,7 +16,6 @@ pub(crate) struct KeyBuf { pub name: String, } - #[derive(Debug, PartialEq)] pub(crate) enum TypeError<'a> { Invalid(&'a str), @@ -107,9 +106,7 @@ pub(crate) struct KeyIterator<'a> { } impl<'a> KeyIterator<'a> { - pub(crate) fn new(data: &'a str) -> KeyIterator<'a> { - KeyIterator { data, read: 0 } - } + pub(crate) fn new(data: &'a str) -> KeyIterator<'a> { KeyIterator { data, read: 0 } } // Parameters are values that follow the semicolon (':'). fn parse_parameter(&mut self, name: &'a str) -> Result<Key<'a>, TypeError<'a>> { diff --git a/src/parser/assignments/splitter.rs b/src/parser/assignments/splitter.rs index 5de8aaddf172eb9e79f80d8b13fbc1e7fd5754f0..711741ab7d4f1426a208f0549ea4421611d6fcd2 100644 --- a/src/parser/assignments/splitter.rs +++ b/src/parser/assignments/splitter.rs @@ -49,9 +49,7 @@ pub(crate) fn split_assignment<'a>( (Some(keys), Some(operator), Some(values.trim())) } -fn is_operator(byte: u8) -> bool { - byte == b'+' || byte == b'-' || byte == b'*' || byte == b'/' -} +fn is_operator(byte: u8) -> bool { byte == b'+' || byte == b'-' || byte == b'*' || byte == b'/' } #[cfg(test)] mod tests { diff --git a/src/parser/loops/for_grammar.rs b/src/parser/loops/for_grammar.rs index e6b639b5507d3e00a503be55656b42311b4f6194..58a3c8bfcdcd40392029e3d2d182e5e21feabf38 100644 --- a/src/parser/loops/for_grammar.rs +++ b/src/parser/loops/for_grammar.rs @@ -70,9 +70,7 @@ mod tests { struct VariableExpander(pub Variables); impl Expander for VariableExpander { - fn variable(&self, var: &str, _: bool) -> Option<Value> { - self.0.get_var(var) - } + fn variable(&self, var: &str, _: bool) -> Option<Value> { self.0.get_var(var) } } #[test] diff --git a/src/parser/pipelines/collector.rs b/src/parser/pipelines/collector.rs index 47633316ffcc3a4d89b39ad51ec2d39cf5117dfc..0f3631f7f65cf86b8e2482e3782af343d862910a 100644 --- a/src/parser/pipelines/collector.rs +++ b/src/parser/pipelines/collector.rs @@ -17,9 +17,7 @@ lazy_static! { } impl<'a> Collector<'a> { - pub(crate) fn new(data: &'a str) -> Self { - Collector { data } - } + pub(crate) fn new(data: &'a str) -> Self { Collector { data } } pub(crate) fn run(data: &'a str) -> Result<Pipeline, &'static str> { Collector::new(data).parse() @@ -356,7 +354,8 @@ impl<'a> Collector<'a> { }; let heredoc = heredoc.lines().skip(1).collect::<Vec<&str>>(); if heredoc.len() > 1 { - let herestring = Input::HereString(heredoc[..heredoc.len()-1].join("\n")); + let herestring = + Input::HereString(heredoc[..heredoc.len() - 1].join("\n")); inputs.as_mut().map(|x| x.push(herestring.clone())); } } @@ -403,8 +402,8 @@ mod tests { let expected = vec![ Redirection { - from: RedirectFrom::Stderr, - file: "/dev/null".to_owned(), + from: RedirectFrom::Stderr, + file: "/dev/null".to_owned(), append: false, }, ]; @@ -778,30 +777,30 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: vec![ + job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: vec![ Input::File("file1".into()), Input::HereString("\"herestring\"".into()), ], outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["tr", "'x'", "'y'"], JobKind::Last), - inputs: Vec::new(), + job: Job::new(array!["tr", "'x'", "'y'"], JobKind::Last), + inputs: Vec::new(), outputs: vec![ Redirection { - from: RedirectFrom::Stderr, - file: "err".into(), + from: RedirectFrom::Stderr, + file: "err".into(), append: true, }, Redirection { - from: RedirectFrom::Both, - file: "both".into(), + from: RedirectFrom::Both, + file: "both".into(), append: false, }, Redirection { - from: RedirectFrom::Stdout, - file: "out".into(), + from: RedirectFrom::Stdout, + file: "out".into(), append: false, }, ], @@ -819,22 +818,22 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: Vec::new(), + job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: Vec::new(), outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["echo", "hello"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: Vec::new(), + job: Job::new(array!["echo", "hello"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: Vec::new(), outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["cat"], JobKind::Last), - inputs: vec![Input::File("stuff".into())], + job: Job::new(array!["cat"], JobKind::Last), + inputs: vec![Input::File("stuff".into())], outputs: vec![ Redirection { - from: RedirectFrom::Stderr, - file: "other".into(), + from: RedirectFrom::Stderr, + file: "other".into(), append: true, }, ], @@ -852,22 +851,22 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: Vec::new(), + job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: Vec::new(), outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["echo", "hello"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: Vec::new(), + job: Job::new(array!["echo", "hello"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: Vec::new(), outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["cat"], JobKind::Last), - inputs: vec![Input::File("stuff".into())], + job: Job::new(array!["cat"], JobKind::Last), + inputs: vec![Input::File("stuff".into())], outputs: vec![ Redirection { - from: RedirectFrom::Both, - file: "other".into(), + from: RedirectFrom::Both, + file: "other".into(), append: true, }, ], @@ -918,8 +917,8 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["calc"], JobKind::Last), - inputs: vec![Input::HereString("$(cat math.txt)".into())], + job: Job::new(array!["calc"], JobKind::Last), + inputs: vec![Input::HereString("$(cat math.txt)".into())], outputs: vec![], }, ], @@ -933,8 +932,8 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["calc"], JobKind::Last), - inputs: vec![Input::HereString("1 + 2\n3 + 4".into())], + job: Job::new(array!["calc"], JobKind::Last), + inputs: vec![Input::HereString("1 + 2\n3 + 4".into())], outputs: vec![], }, ], @@ -950,17 +949,17 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), - inputs: Vec::new(), + job: Job::new(array!["cat"], JobKind::Pipe(RedirectFrom::Stdout)), + inputs: Vec::new(), outputs: Vec::new(), }, PipeItem { - job: Job::new(array!["tr", "'o'", "'x'"], JobKind::Last), - inputs: vec![Input::HereString("$VAR".into())], + job: Job::new(array!["tr", "'o'", "'x'"], JobKind::Last), + inputs: vec![Input::HereString("$VAR".into())], outputs: vec![ Redirection { - from: RedirectFrom::Stdout, - file: "out.log".into(), + from: RedirectFrom::Stdout, + file: "out.log".into(), append: false, }, ], @@ -993,12 +992,12 @@ mod tests { let expected = Pipeline { items: vec![ PipeItem { - job: Job::new(array!["echo", "zardoz"], JobKind::Last), - inputs: Vec::new(), + job: Job::new(array!["echo", "zardoz"], JobKind::Last), + inputs: Vec::new(), outputs: vec![ Redirection { - from: RedirectFrom::Stdout, - file: "foo\\'bar".into(), + from: RedirectFrom::Stdout, + file: "foo\\'bar".into(), append: true, }, ], diff --git a/src/parser/pipelines/mod.rs b/src/parser/pipelines/mod.rs index da00bbb2f9189127cc51de72f8ea0ee34df223a1..301281e8336a291710cadfa6d6ae60fd8f6326c1 100644 --- a/src/parser/pipelines/mod.rs +++ b/src/parser/pipelines/mod.rs @@ -15,12 +15,11 @@ pub(crate) enum RedirectFrom { #[derive(Debug, PartialEq, Clone)] pub(crate) struct Redirection { - pub from: RedirectFrom, - pub file: String, + pub from: RedirectFrom, + pub file: String, pub append: bool, } - /// Represents input that a process could initially receive from `stdin` #[derive(Debug, PartialEq, Clone)] pub(crate) enum Input { @@ -39,9 +38,9 @@ pub(crate) struct Pipeline { #[derive(Debug, PartialEq, Clone)] pub(crate) struct PipeItem { - pub job: Job, + pub job: Job, pub outputs: Vec<Redirection>, - pub inputs: Vec<Input>, + pub inputs: Vec<Input>, } impl PipeItem { @@ -72,9 +71,7 @@ impl PipeItem { } impl Pipeline { - pub(crate) fn new() -> Self { - Pipeline { items: Vec::new() } - } + pub(crate) fn new() -> Self { Pipeline { items: Vec::new() } } pub(crate) fn expand(&mut self, shell: &Shell) { self.items.iter_mut().for_each(|i| i.expand(shell)); diff --git a/src/parser/quotes.rs b/src/parser/quotes.rs index fcf604f8708604dd0a1427beb30425b49675e5e6..fe9149531db6eba7beb99c3f6d71abe8980e568a 100644 --- a/src/parser/quotes.rs +++ b/src/parser/quotes.rs @@ -18,35 +18,31 @@ bitflags! { /// This example comes from the shell's REPL, which ensures that the user's input /// will only be submitted for execution once a terminated command is supplied. pub struct Terminator { - buffer: String, - eof: Option<String>, + buffer: String, + eof: Option<String>, eof_buffer: String, - array: usize, - read: usize, - flags: Flags, + array: usize, + read: usize, + flags: Flags, } impl<'a> From<&'a str> for Terminator { - fn from(string: &'a str) -> Terminator { - Terminator::new(string.to_owned()) - } + fn from(string: &'a str) -> Terminator { Terminator::new(string.to_owned()) } } impl From<String> for Terminator { - fn from(string: String) -> Terminator { - Terminator::new(string) - } + fn from(string: String) -> Terminator { Terminator::new(string) } } impl Terminator { pub fn new(input: String) -> Terminator { Terminator { - buffer: input, - eof: None, + buffer: input, + eof: None, eof_buffer: String::new(), - array: 0, - read: 0, - flags: Flags::empty(), + array: 0, + read: 0, + flags: Flags::empty(), } } @@ -63,7 +59,6 @@ impl Terminator { } } - pub fn is_terminated(&mut self) -> bool { let mut eof_line = None; let eof = self.eof.clone(); @@ -187,7 +182,5 @@ impl Terminator { } /// Consumes the `Terminator`, and returns the underlying `String`. - pub fn consume(self) -> String { - self.buffer - } + pub fn consume(self) -> String { self.buffer } } diff --git a/src/parser/shell_expand/mod.rs b/src/parser/shell_expand/mod.rs index c97a1c1486e06f3889f3214c86ea17ddd4297e22..71e3880bbc9109f776ac841703650ab2178cfc6c 100644 --- a/src/parser/shell_expand/mod.rs +++ b/src/parser/shell_expand/mod.rs @@ -26,21 +26,13 @@ pub(crate) fn is_expression(s: &str) -> bool { /// Trait representing different elements of string expansion pub(crate) trait Expander { /// Expand a tilde form to the correct directory - fn tilde(&self, &str) -> Option<String> { - None - } + fn tilde(&self, &str) -> Option<String> { None } /// Expand an array variable with some selection - fn array(&self, &str, Select) -> Option<Array> { - None - } + fn array(&self, &str, Select) -> Option<Array> { None } /// Expand a string variable given if its quoted / unquoted - fn variable(&self, &str, bool) -> Option<Value> { - None - } + fn variable(&self, &str, bool) -> Option<Value> { None } /// Expand a subshell expression - fn command(&self, &str) -> Option<Value> { - None - } + fn command(&self, &str) -> Option<Value> { None } } fn expand_process<E: Expander>( @@ -647,9 +639,7 @@ mod test { struct CommandExpander; impl Expander for CommandExpander { - fn command(&self, cmd: &str) -> Option<Value> { - Some(cmd.to_owned()) - } + fn command(&self, cmd: &str) -> Option<Value> { Some(cmd.to_owned()) } } #[test] diff --git a/src/parser/shell_expand/ranges.rs b/src/parser/shell_expand/ranges.rs index 5751d1369dd229b5cc2fe0384faa562e6faabfe4..114bc93ab413400c8684781bbd876f366c474db0 100644 --- a/src/parser/shell_expand/ranges.rs +++ b/src/parser/shell_expand/ranges.rs @@ -67,9 +67,7 @@ fn numeric_range( } #[inline] -fn byte_is_valid_range(b: u8) -> bool { - (b >= b'a' && b <= b'z') || (b >= b'A' && b <= b'Z') -} +fn byte_is_valid_range(b: u8) -> bool { (b >= b'a' && b <= b'z') || (b >= b'A' && b <= b'Z') } use std::u8; fn char_range(start: u8, mut end: u8, step: isize, inclusive: bool) -> Option<Vec<String>> { @@ -112,7 +110,6 @@ fn strings_to_isizes(a: &str, b: &str) -> Option<(isize, isize)> { } } - // In a range we allow the following syntax: // Exclusive nonstepped: {start..end} // Inclusive nonstepped: {start...end} @@ -284,7 +281,6 @@ pub(crate) fn parse_index_range(input: &str) -> Option<Range> { None } - #[test] fn index_ranges() { let valid_cases = vec![ @@ -381,7 +377,6 @@ fn range_expand() { let expected = Some(vec!["c".to_owned(), "b".to_owned()]); assert_eq!(actual, expected); - let actual = parse_range("-3..4"); let expected = Some(vec![ "-3".to_owned(), diff --git a/src/parser/shell_expand/words/methods/arrays.rs b/src/parser/shell_expand/words/methods/arrays.rs index 7df75fc8d939e252a00ab9218c5a90087165f2ad..660ac1fd91ca366d6c4fc49e23e48da043444785 100644 --- a/src/parser/shell_expand/words/methods/arrays.rs +++ b/src/parser/shell_expand/words/methods/arrays.rs @@ -9,9 +9,9 @@ use unicode_segmentation::UnicodeSegmentation; #[derive(Debug, PartialEq, Clone)] pub(crate) struct ArrayMethod<'a> { - pub(crate) method: &'a str, - pub(crate) variable: &'a str, - pub(crate) pattern: Pattern<'a>, + pub(crate) method: &'a str, + pub(crate) variable: &'a str, + pub(crate) pattern: Pattern<'a>, pub(crate) selection: Select, } @@ -199,9 +199,9 @@ mod test { fn test_split_string_all() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$FOO", - pattern: Pattern::StringPattern("OB"), + method: "split", + variable: "$FOO", + pattern: Pattern::StringPattern("OB"), selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -212,9 +212,9 @@ mod test { fn test_split_whitespace_all() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -225,9 +225,9 @@ mod test { fn test_split_string_index_forward() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$FOO", - pattern: Pattern::StringPattern("OB"), + method: "split", + variable: "$FOO", + pattern: Pattern::StringPattern("OB"), selection: Select::Index(Index::Forward(1)), }; method.handle(&mut output, &VariableExpander); @@ -238,9 +238,9 @@ mod test { fn test_split_whitespace_index_forward() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::Index(Index::Forward(1)), }; method.handle(&mut output, &VariableExpander); @@ -251,9 +251,9 @@ mod test { fn test_split_string_index_backward() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$FOO", - pattern: Pattern::StringPattern("OB"), + method: "split", + variable: "$FOO", + pattern: Pattern::StringPattern("OB"), selection: Select::Index(Index::Backward(1)), }; method.handle(&mut output, &VariableExpander); @@ -264,9 +264,9 @@ mod test { fn test_split_whitespace_index_backward() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::Index(Index::Backward(1)), }; method.handle(&mut output, &VariableExpander); @@ -277,9 +277,9 @@ mod test { fn test_split_string_range() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$FOO", - pattern: Pattern::StringPattern("OB"), + method: "split", + variable: "$FOO", + pattern: Pattern::StringPattern("OB"), selection: Select::Range(Range::from(Index::Forward(0))), }; method.handle(&mut output, &VariableExpander); @@ -290,9 +290,9 @@ mod test { fn test_split_whitespace_range() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::Range(Range::from(Index::Forward(0))), }; method.handle(&mut output, &VariableExpander); @@ -303,9 +303,9 @@ mod test { fn test_split_none() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::None, }; method.handle(&mut output, &VariableExpander); @@ -316,9 +316,9 @@ mod test { fn test_split_key() { let mut output = String::new(); let method = ArrayMethod { - method: "split", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::Key(Key::new("1")), }; method.handle(&mut output, &VariableExpander); @@ -328,9 +328,9 @@ mod test { #[test] fn test_split_at_failing_whitespace() { let method = ArrayMethod { - method: "split_at", - variable: "$SPACEDFOO", - pattern: Pattern::Whitespace, + method: "split_at", + variable: "$SPACEDFOO", + pattern: Pattern::Whitespace, selection: Select::All, }; assert_eq!(method.handle_as_array(&VariableExpander), array![]); @@ -339,9 +339,9 @@ mod test { #[test] fn test_split_at_failing_no_number() { let method = ArrayMethod { - method: "split_at", - variable: "$SPACEDFOO", - pattern: Pattern::StringPattern("a"), + method: "split_at", + variable: "$SPACEDFOO", + pattern: Pattern::StringPattern("a"), selection: Select::All, }; assert_eq!(method.handle_as_array(&VariableExpander), array![]); @@ -350,9 +350,9 @@ mod test { #[test] fn test_split_at_failing_out_of_bound() { let method = ArrayMethod { - method: "split_at", - variable: "$SPACEDFOO", - pattern: Pattern::StringPattern("100"), + method: "split_at", + variable: "$SPACEDFOO", + pattern: Pattern::StringPattern("100"), selection: Select::All, }; assert_eq!(method.handle_as_array(&VariableExpander), array![]); @@ -361,9 +361,9 @@ mod test { #[test] fn test_split_at_succeeding() { let method = ArrayMethod { - method: "split_at", - variable: "$FOO", - pattern: Pattern::StringPattern("3"), + method: "split_at", + variable: "$FOO", + pattern: Pattern::StringPattern("3"), selection: Select::All, }; assert_eq!( @@ -375,9 +375,9 @@ mod test { #[test] fn test_graphemes() { let method = ArrayMethod { - method: "graphemes", - variable: "$FOO", - pattern: Pattern::StringPattern("3"), + method: "graphemes", + variable: "$FOO", + pattern: Pattern::StringPattern("3"), selection: Select::All, }; assert_eq!( @@ -389,9 +389,9 @@ mod test { #[test] fn test_bytes() { let method = ArrayMethod { - method: "bytes", - variable: "$FOO", - pattern: Pattern::StringPattern("3"), + method: "bytes", + variable: "$FOO", + pattern: Pattern::StringPattern("3"), selection: Select::All, }; assert_eq!( @@ -403,9 +403,9 @@ mod test { #[test] fn test_chars() { let method = ArrayMethod { - method: "chars", - variable: "$FOO", - pattern: Pattern::StringPattern("3"), + method: "chars", + variable: "$FOO", + pattern: Pattern::StringPattern("3"), selection: Select::All, }; assert_eq!( diff --git a/src/parser/shell_expand/words/methods/mod.rs b/src/parser/shell_expand/words/methods/mod.rs index 90ed166e9315a3f14f978777b5f38d02126058d4..34d855331c23d1425f264df8a124e33e2e356131 100644 --- a/src/parser/shell_expand/words/methods/mod.rs +++ b/src/parser/shell_expand/words/methods/mod.rs @@ -21,16 +21,12 @@ pub(crate) struct Key { impl Key { #[cfg(test)] - pub(crate) fn new<K: Into<::types::Key>>(key: K) -> Key { - Key { key: key.into() } - } - pub(crate) fn get(&self) -> &::types::Key { - return &self.key; - } + pub(crate) fn new<K: Into<::types::Key>>(key: K) -> Key { Key { key: key.into() } } + pub(crate) fn get(&self) -> &::types::Key { return &self.key; } } pub(crate) struct MethodArgs<'a, 'b, E: 'b + Expander> { - args: &'a str, + args: &'a str, expand: &'b E, } diff --git a/src/parser/shell_expand/words/methods/strings.rs b/src/parser/shell_expand/words/methods/strings.rs index c20f01241e387d9666bd8306c5646ddeb104ed75..1da1f9288bb7c6e14ae641214f88994026199077 100644 --- a/src/parser/shell_expand/words/methods/strings.rs +++ b/src/parser/shell_expand/words/methods/strings.rs @@ -344,9 +344,9 @@ mod test { fn test_ends_with_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "ends_with", - variable: "$FOO", - pattern: "\"BAR\"", + method: "ends_with", + variable: "$FOO", + pattern: "\"BAR\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -357,9 +357,9 @@ mod test { fn test_ends_with_failing() { let mut output = String::new(); let method = StringMethod { - method: "ends_with", - variable: "$FOO", - pattern: "\"BA\"", + method: "ends_with", + variable: "$FOO", + pattern: "\"BA\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -370,9 +370,9 @@ mod test { fn test_contains_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "contains", - variable: "$FOO", - pattern: "\"OBA\"", + method: "contains", + variable: "$FOO", + pattern: "\"OBA\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -383,9 +383,9 @@ mod test { fn test_contains_failing() { let mut output = String::new(); let method = StringMethod { - method: "contains", - variable: "$FOO", - pattern: "\"OBI\"", + method: "contains", + variable: "$FOO", + pattern: "\"OBI\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -396,9 +396,9 @@ mod test { fn test_starts_with_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "starts_with", - variable: "$FOO", - pattern: "\"FOO\"", + method: "starts_with", + variable: "$FOO", + pattern: "\"FOO\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -409,9 +409,9 @@ mod test { fn test_starts_with_failing() { let mut output = String::new(); let method = StringMethod { - method: "starts_with", - variable: "$FOO", - pattern: "\"OO\"", + method: "starts_with", + variable: "$FOO", + pattern: "\"OO\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -422,9 +422,9 @@ mod test { fn test_basename() { let mut output = String::new(); let method = StringMethod { - method: "basename", - variable: "\"/home/redox/file.txt\"", - pattern: "", + method: "basename", + variable: "\"/home/redox/file.txt\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -435,9 +435,9 @@ mod test { fn test_extension() { let mut output = String::new(); let method = StringMethod { - method: "extension", - variable: "\"/home/redox/file.txt\"", - pattern: "", + method: "extension", + variable: "\"/home/redox/file.txt\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -448,9 +448,9 @@ mod test { fn test_filename() { let mut output = String::new(); let method = StringMethod { - method: "filename", - variable: "\"/home/redox/file.txt\"", - pattern: "", + method: "filename", + variable: "\"/home/redox/file.txt\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -461,9 +461,9 @@ mod test { fn test_parent() { let mut output = String::new(); let method = StringMethod { - method: "parent", - variable: "\"/home/redox/file.txt\"", - pattern: "", + method: "parent", + variable: "\"/home/redox/file.txt\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -474,9 +474,9 @@ mod test { fn test_to_lowercase() { let mut output = String::new(); let method = StringMethod { - method: "to_lowercase", - variable: "\"Ford Prefect\"", - pattern: "", + method: "to_lowercase", + variable: "\"Ford Prefect\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -487,9 +487,9 @@ mod test { fn test_to_uppercase() { let mut output = String::new(); let method = StringMethod { - method: "to_uppercase", - variable: "\"Ford Prefect\"", - pattern: "", + method: "to_uppercase", + variable: "\"Ford Prefect\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -500,9 +500,9 @@ mod test { fn test_repeat_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "repeat", - variable: "$FOO", - pattern: "2", + method: "repeat", + variable: "$FOO", + pattern: "2", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -513,9 +513,9 @@ mod test { fn test_repeat_failing() { let mut output = String::new(); let method = StringMethod { - method: "repeat", - variable: "$FOO", - pattern: "-2", + method: "repeat", + variable: "$FOO", + pattern: "-2", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -526,9 +526,9 @@ mod test { fn test_replace_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "replace", - variable: "$FOO", - pattern: "[\"FOO\" \"BAR\"]", + method: "replace", + variable: "$FOO", + pattern: "[\"FOO\" \"BAR\"]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -539,9 +539,9 @@ mod test { fn test_replace_failing() { let mut output = String::new(); let method = StringMethod { - method: "replace", - variable: "$FOO", - pattern: "[]", + method: "replace", + variable: "$FOO", + pattern: "[]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -552,9 +552,9 @@ mod test { fn test_replacen_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "replacen", - variable: "\"FOO$FOO\"", - pattern: "[\"FOO\" \"BAR\" 1]", + method: "replacen", + variable: "\"FOO$FOO\"", + pattern: "[\"FOO\" \"BAR\" 1]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -565,9 +565,9 @@ mod test { fn test_replacen_failing() { let mut output = String::new(); let method = StringMethod { - method: "replacen", - variable: "$FOO", - pattern: "[]", + method: "replacen", + variable: "$FOO", + pattern: "[]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -578,9 +578,9 @@ mod test { fn test_regex_replace_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "regex_replace", - variable: "$FOO", - pattern: "[\"^F\" \"f\"]", + method: "regex_replace", + variable: "$FOO", + pattern: "[\"^F\" \"f\"]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -591,9 +591,9 @@ mod test { fn test_regex_replace_failing() { let mut output = String::new(); let method = StringMethod { - method: "regex_replace", - variable: "$FOO", - pattern: "[\"^f\" \"F\"]", + method: "regex_replace", + variable: "$FOO", + pattern: "[\"^f\" \"F\"]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -604,9 +604,9 @@ mod test { fn test_join_with_string() { let mut output = String::new(); let method = StringMethod { - method: "join", - variable: "[\"FOO\" \"BAR\"]", - pattern: "\" \"", + method: "join", + variable: "[\"FOO\" \"BAR\"]", + pattern: "\" \"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -617,9 +617,9 @@ mod test { fn test_join_with_array() { let mut output = String::new(); let method = StringMethod { - method: "join", - variable: "[\"FOO\" \"BAR\"]", - pattern: "[\"-\" \"-\"]", + method: "join", + variable: "[\"FOO\" \"BAR\"]", + pattern: "[\"-\" \"-\"]", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -630,9 +630,9 @@ mod test { fn test_len_with_array() { let mut output = String::new(); let method = StringMethod { - method: "len", - variable: "[\"1\"]", - pattern: "", + method: "len", + variable: "[\"1\"]", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -643,9 +643,9 @@ mod test { fn test_len_with_string() { let mut output = String::new(); let method = StringMethod { - method: "len", - variable: "\"FOO\"", - pattern: "", + method: "len", + variable: "\"FOO\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -656,9 +656,9 @@ mod test { fn test_len_with_variable() { let mut output = String::new(); let method = StringMethod { - method: "len", - variable: "$FOO", - pattern: "", + method: "len", + variable: "$FOO", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -669,9 +669,9 @@ mod test { fn test_len_bytes_with_variable() { let mut output = String::new(); let method = StringMethod { - method: "len_bytes", - variable: "$FOO", - pattern: "", + method: "len_bytes", + variable: "$FOO", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -682,9 +682,9 @@ mod test { fn test_len_bytes_with_string() { let mut output = String::new(); let method = StringMethod { - method: "len_bytes", - variable: "\"oh là là \"", - pattern: "", + method: "len_bytes", + variable: "\"oh là là \"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -695,9 +695,9 @@ mod test { fn test_reverse_with_variable() { let mut output = String::new(); let method = StringMethod { - method: "reverse", - variable: "$FOO", - pattern: "", + method: "reverse", + variable: "$FOO", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -708,9 +708,9 @@ mod test { fn test_reverse_with_string() { let mut output = String::new(); let method = StringMethod { - method: "reverse", - variable: "\"FOOBAR\"", - pattern: "", + method: "reverse", + variable: "\"FOOBAR\"", + pattern: "", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -721,9 +721,9 @@ mod test { fn test_find_succeeding() { let mut output = String::new(); let method = StringMethod { - method: "find", - variable: "$FOO", - pattern: "\"O\"", + method: "find", + variable: "$FOO", + pattern: "\"O\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); @@ -734,9 +734,9 @@ mod test { fn test_find_failing() { let mut output = String::new(); let method = StringMethod { - method: "find", - variable: "$FOO", - pattern: "\"L\"", + method: "find", + variable: "$FOO", + pattern: "\"L\"", selection: Select::All, }; method.handle(&mut output, &VariableExpander); diff --git a/src/parser/shell_expand/words/mod.rs b/src/parser/shell_expand/words/mod.rs index 7cf7cec139fc226bae073d6d0053e5822ccccda3..7b16eec6cb10ebfe65c91b36615dab60547dabcf 100644 --- a/src/parser/shell_expand/words/mod.rs +++ b/src/parser/shell_expand/words/mod.rs @@ -48,9 +48,9 @@ pub(crate) enum WordToken<'a> { } pub(crate) struct WordIterator<'a, E: Expander + 'a> { - data: &'a str, - read: usize, - flags: Flags, + data: &'a str, + read: usize, + flags: Flags, expanders: &'a E, } diff --git a/src/parser/shell_expand/words/select.rs b/src/parser/shell_expand/words/select.rs index 7099df1fe7ca53861d4bcf5412bb090b46db3f32..0bc07bedbfbf4658d46521ca698dbce265aaa7b4 100644 --- a/src/parser/shell_expand/words/select.rs +++ b/src/parser/shell_expand/words/select.rs @@ -4,7 +4,6 @@ use super::super::ranges::parse_index_range; use std::iter::{empty, FromIterator}; use std::str::FromStr; - /// Represents a filter on a vector-like object #[derive(Debug, PartialEq, Clone)] pub(crate) enum Select { diff --git a/src/parser/shell_expand/words/tests.rs b/src/parser/shell_expand/words/tests.rs index 839d2f5bc2dd3e065845667c381c84820a65529b..f47e7aa5ff277048540abe2e917b4258aa72bcde 100644 --- a/src/parser/shell_expand/words/tests.rs +++ b/src/parser/shell_expand/words/tests.rs @@ -24,22 +24,21 @@ fn ranges() { assert_eq!(None, range2.bounds(3)); } - #[test] fn string_method() { let input = "$join(array, 'pattern') $join(array, 'pattern')"; let expected = vec![ WordToken::StringMethod(StringMethod { - method: "join", - variable: "array", - pattern: "'pattern'", + method: "join", + variable: "array", + pattern: "'pattern'", selection: Select::All, }), WordToken::Whitespace(" "), WordToken::StringMethod(StringMethod { - method: "join", - variable: "array", - pattern: "'pattern'", + method: "join", + variable: "array", + pattern: "'pattern'", selection: Select::All, }), ]; @@ -265,25 +264,25 @@ impl Expander for WithVars { fn array_methods() { let expanders = WithVars; let method = ArrayMethod { - method: "graphemes", - variable: "pkmn1", - pattern: Pattern::Whitespace, + method: "graphemes", + variable: "pkmn1", + pattern: Pattern::Whitespace, selection: Select::Index(Index::Forward(3)), }; let expected = array!["é"]; assert_eq!(method.handle_as_array(&expanders), expected); let method = ArrayMethod { - method: "chars", - variable: "pkmn2", - pattern: Pattern::Whitespace, + method: "chars", + variable: "pkmn2", + pattern: Pattern::Whitespace, selection: Select::Index(Index::Forward(3)), }; let expected = array!["e"]; assert_eq!(method.handle_as_array(&expanders), expected); let method = ArrayMethod { - method: "bytes", - variable: "pkmn2", - pattern: Pattern::Whitespace, + method: "bytes", + variable: "pkmn2", + pattern: Pattern::Whitespace, selection: Select::Index(Index::Forward(1)), }; let expected = array!["111"]; diff --git a/src/parser/statement/parse.rs b/src/parser/statement/parse.rs index a6fbd930fb1e9c2300ee6e8796dafddd5a5a763e..a906895c6ce5aea9dd4b2cc17ed721d6e797b40c 100644 --- a/src/parser/statement/parse.rs +++ b/src/parser/statement/parse.rs @@ -19,9 +19,7 @@ where } } -fn is_valid_name(name: &str) -> bool { - !name.chars().any(|c| !(c.is_alphanumeric() || c == '_')) -} +fn is_valid_name(name: &str) -> bool { !name.chars().any(|c| !(c.is_alphanumeric() || c == '_')) } pub(crate) fn parse(code: &str) -> Statement { let cmd = code.trim(); @@ -102,13 +100,11 @@ pub(crate) fn parse(code: &str) -> Statement { } } _ if cmd.starts_with("if ") => { - return collect(cmd[3..].trim_left(), |pipeline| { - Statement::If { - expression: pipeline, - success: Vec::new(), - else_if: Vec::new(), - failure: Vec::new(), - } + return collect(cmd[3..].trim_left(), |pipeline| Statement::If { + expression: pipeline, + success: Vec::new(), + else_if: Vec::new(), + failure: Vec::new(), }) } "else" => return Statement::Else, @@ -120,17 +116,15 @@ pub(crate) fn parse(code: &str) -> Statement { return collect(cmd[3..].trim_left(), |pipeline| { Statement::ElseIf(ElseIf { expression: pipeline, - success: Vec::new(), + success: Vec::new(), }) }); } } _ if cmd.starts_with("while ") => { - return collect(cmd[6..].trim_left(), |pipeline| { - Statement::While { - expression: pipeline, - statements: Vec::new(), - } + return collect(cmd[6..].trim_left(), |pipeline| Statement::While { + expression: pipeline, + statements: Vec::new(), }) } _ if cmd.starts_with("for ") => { @@ -152,8 +146,8 @@ pub(crate) fn parse(code: &str) -> Statement { } return Statement::For { - variable: variable.into(), - values: ArgumentSplitter::new(cmd[3..].trim_left()) + variable: variable.into(), + values: ArgumentSplitter::new(cmd[3..].trim_left()) .map(String::from) .collect(), statements: Vec::new(), @@ -189,7 +183,7 @@ pub(crate) fn parse(code: &str) -> Statement { _ if cmd.starts_with("match ") => { return Statement::Match { expression: cmd[6..].trim_left().into(), - cases: Vec::new(), + cases: Vec::new(), } } _ if cmd.starts_with("fn ") => { @@ -198,8 +192,8 @@ pub(crate) fn parse(code: &str) -> Statement { let name = &cmd[..pos]; if !is_valid_name(name) { eprintln!( - "ion: syntax error: '{}' is not a valid function name\n \ - Function names may only contain alphanumeric characters", + "ion: syntax error: '{}' is not a valid function name\n Function names \ + may only contain alphanumeric characters", name ); return Statement::Default; @@ -228,7 +222,6 @@ pub(crate) fn parse(code: &str) -> Statement { _ => (), } - if cmd.is_empty() || cmd.starts_with('#') { Statement::Default } else { @@ -252,7 +245,7 @@ mod tests { expression: Pipeline { items: vec![ PipeItem { - job: Job::new( + job: Job::new( vec![ "test".to_owned(), "1".to_owned(), @@ -263,13 +256,13 @@ mod tests { JobKind::Last, ), outputs: Vec::new(), - inputs: Vec::new(), + inputs: Vec::new(), }, ], }, - success: vec![], - else_if: vec![], - failure: vec![], + success: vec![], + else_if: vec![], + failure: vec![], }; assert_eq!(correct_parse, parsed_if); @@ -318,9 +311,9 @@ mod tests { let parsed_if = parse("fn bob"); let correct_parse = Statement::Function { description: None, - name: "bob".into(), - args: Default::default(), - statements: Default::default(), + name: "bob".into(), + args: Default::default(), + statements: Default::default(), }; assert_eq!(correct_parse, parsed_if); @@ -336,8 +329,8 @@ mod tests { let parsed_if = parse("fn bob a b"); let correct_parse = Statement::Function { description: None, - name: "bob".into(), - args: vec![ + name: "bob".into(), + args: vec![ KeyBuf { name: "a".into(), kind: Primitive::Any, @@ -347,7 +340,7 @@ mod tests { kind: Primitive::Any, }, ], - statements: Default::default(), + statements: Default::default(), }; assert_eq!(correct_parse, parsed_if); @@ -358,8 +351,8 @@ mod tests { let parsed_if = parse("fn bob a b --bob is a nice function"); let correct_parse = Statement::Function { description: Some("bob is a nice function".to_string()), - name: "bob".into(), - args: vec![ + name: "bob".into(), + args: vec![ KeyBuf { name: "a".into(), kind: Primitive::Any, @@ -369,7 +362,7 @@ mod tests { kind: Primitive::Any, }, ], - statements: vec![], + statements: vec![], }; assert_eq!(correct_parse, parsed_if); let parsed_if = parse("fn bob a b -- bob is a nice function"); diff --git a/src/parser/statement/splitter.rs b/src/parser/statement/splitter.rs index 61e229b8f7897974e54fd6f555e86ec699fc5a43..8354a48e94017beef8a48fe2720f1f7013286f54 100644 --- a/src/parser/statement/splitter.rs +++ b/src/parser/statement/splitter.rs @@ -20,7 +20,6 @@ bitflags! { } } - #[derive(Debug, PartialEq)] pub(crate) enum StatementError<'a> { IllegalCommandName(&'a str), @@ -42,8 +41,7 @@ impl<'a> Display for StatementError<'a> { StatementError::InvalidCharacter(character, position) => writeln!( f, "syntax error: '{}' at position {} is out of place", - character, - position + character, position ), StatementError::UnterminatedSubshell => { writeln!(f, "syntax error: unterminated subshell") @@ -70,26 +68,26 @@ fn is_invalid(byte: u8) -> bool { } pub(crate) struct StatementSplitter<'a> { - data: &'a str, - read: usize, - flags: Flags, - a_level: u8, - ap_level: u8, - p_level: u8, - brace_level: u8, + data: &'a str, + read: usize, + flags: Flags, + a_level: u8, + ap_level: u8, + p_level: u8, + brace_level: u8, math_paren_level: i8, } impl<'a> StatementSplitter<'a> { pub(crate) fn new(data: &'a str) -> StatementSplitter<'a> { StatementSplitter { - data: data, - read: 0, - flags: Flags::empty(), - a_level: 0, - ap_level: 0, - p_level: 0, - brace_level: 0, + data: data, + read: 0, + flags: Flags::empty(), + a_level: 0, + ap_level: 0, + p_level: 0, + brace_level: 0, math_paren_level: 0, } } diff --git a/src/shell/assignments.rs b/src/shell/assignments.rs index dfd5171182c342ce162e6166b1b058dd71fd4749..a021d78da3507c778b153e4d8e779a89e28ff98d 100644 --- a/src/shell/assignments.rs +++ b/src/shell/assignments.rs @@ -57,7 +57,6 @@ pub(crate) trait VariableStore { fn export(&mut self, ExportAction) -> i32; } - impl VariableStore for Shell { fn local(&mut self, action: LocalAction) -> i32 { let actions = match action { @@ -89,8 +88,7 @@ impl VariableStore for Shell { } Ok(Action::UpdateArray(..)) => { eprintln!( - "ion: arithmetic operators on array expressions aren't supported \ - yet." + "ion: arithmetic operators on array expressions aren't supported yet." ); return FAILURE; } diff --git a/src/shell/binary/designators.rs b/src/shell/binary/designators.rs index 6bfc468a60ac18bfc0adc86c6b75cc826020fd8f..7ef640d6087726516ba36e76ed371547a6c504ab 100644 --- a/src/shell/binary/designators.rs +++ b/src/shell/binary/designators.rs @@ -18,7 +18,7 @@ enum Token<'a> { } struct DesignatorSearcher<'a> { - data: &'a [u8], + data: &'a [u8], flags: Flags, } @@ -104,9 +104,7 @@ pub(crate) fn expand_designators<'a>(shell: &Shell, cmd: &'a str) -> Cow<'a, str Cow::Borrowed(cmd) } -fn command<'a>(text: &'a str) -> &'a str { - ArgumentSplitter::new(text).next().unwrap_or(text) -} +fn command<'a>(text: &'a str) -> &'a str { ArgumentSplitter::new(text).next().unwrap_or(text) } fn args(text: &str) -> &str { let bytes = text.as_bytes(); @@ -123,10 +121,6 @@ fn args(text: &str) -> &str { .unwrap_or(text) } -fn first_arg<'a>(text: &'a str) -> &'a str { - ArgumentSplitter::new(text).nth(1).unwrap_or(text) -} +fn first_arg<'a>(text: &'a str) -> &'a str { ArgumentSplitter::new(text).nth(1).unwrap_or(text) } -fn last_arg<'a>(text: &'a str) -> &'a str { - ArgumentSplitter::new(text).last().unwrap_or(text) -} +fn last_arg<'a>(text: &'a str) -> &'a str { ArgumentSplitter::new(text).last().unwrap_or(text) } diff --git a/src/shell/binary/mod.rs b/src/shell/binary/mod.rs index d7c0a28365aee4f13561bce7a913db182ebb4476..0789a0b5903729c6158298f33aa38c4f073e5577 100644 --- a/src/shell/binary/mod.rs +++ b/src/shell/binary/mod.rs @@ -49,17 +49,11 @@ pub(crate) trait Binary { } impl Binary for Shell { - fn prompt(&mut self) -> String { - prompt(self) - } + fn prompt(&mut self) -> String { prompt(self) } - fn prompt_fn(&mut self) -> Option<String> { - prompt_fn(self) - } + fn prompt_fn(&mut self) -> Option<String> { prompt_fn(self) } - fn readln(&mut self) -> Option<String> { - readln(self) - } + fn readln(&mut self) -> Option<String> { readln(self) } fn terminate_script_quotes<I: Iterator<Item = String>>(&mut self, lines: I) -> i32 { terminate_script_quotes(self, lines) @@ -115,8 +109,7 @@ impl Binary for Shell { let history_filename = self.get_var_or_empty("HISTFILE"); eprintln!( "ion: failed to find history file {}: {}", - history_filename, - err + history_filename, err ); } Err(err) => { diff --git a/src/shell/binary/terminate.rs b/src/shell/binary/terminate.rs index c288c206ab6d6b5a0369df894c1ec93522462457..3ef4658c9f1b033b1bc35aa85f8ecad0c3e95707 100644 --- a/src/shell/binary/terminate.rs +++ b/src/shell/binary/terminate.rs @@ -19,13 +19,11 @@ pub(crate) fn terminate_script_quotes<I: Iterator<Item = String>>( } match command[start..].find('#').map(|x| x + start) { - Some(pos) if command.as_bytes()[pos-1] != b' ' => { + Some(pos) if command.as_bytes()[pos - 1] != b' ' => { start = pos + 1; } - Some(pos) => { - break &command[..pos] - } - None => break &command + Some(pos) => break &command[..pos], + None => break &command, } }; buffer.append(cmd); diff --git a/src/shell/colors.rs b/src/shell/colors.rs index 665e50dd38d7c1972946faaaedb18d2b00fb18bb..91e790cf8e611b668482f97923fec29c7213ac26 100644 --- a/src/shell/colors.rs +++ b/src/shell/colors.rs @@ -1,13 +1,14 @@ struct StaticMap { - keys: &'static [&'static str], + keys: &'static [&'static str], values: &'static [&'static str], } impl StaticMap { fn get(&self, key: &str) -> Option<&'static str> { - self.keys.binary_search(&key).ok().map(|pos| unsafe { - *self.values.get_unchecked(pos) - }) + self.keys + .binary_search(&key) + .ok() + .map(|pos| unsafe { *self.values.get_unchecked(pos) }) } } @@ -131,7 +132,6 @@ impl Colors { } } - /// If no matches were made, then this will attempt to parse the variable as either a /// 24-bit true color color, or one of 256 colors. It supports both hexadecimal and /// decimals. diff --git a/src/shell/completer.rs b/src/shell/completer.rs index 8aa55d86406e421a7211bfc85e852b6d2ecfb840..8df962e375491db122e4213f37eae65d8b51ec04 100644 --- a/src/shell/completer.rs +++ b/src/shell/completer.rs @@ -21,9 +21,9 @@ impl IonFileCompleter { vars: *const Variables, ) -> IonFileCompleter { IonFileCompleter { - inner: FilenameCompleter::new(path), + inner: FilenameCompleter::new(path), dir_stack: dir_stack, - vars: vars, + vars: vars, } } } @@ -151,9 +151,7 @@ where A: Completer, B: Completer, { - pub(crate) fn new(a: Vec<A>, b: B) -> MultiCompleter<A, B> { - MultiCompleter { a: a, b: b } - } + pub(crate) fn new(a: Vec<A>, b: B) -> MultiCompleter<A, B> { MultiCompleter { a: a, b: b } } } impl<A, B> Completer for MultiCompleter<A, B> diff --git a/src/shell/directory_stack.rs b/src/shell/directory_stack.rs index a20150a3b45a3d1cc99c1b892d5b3017b731eef8..5eefe5c57c5ee84eac3efcccf80ed1bedc69d5c4 100644 --- a/src/shell/directory_stack.rs +++ b/src/shell/directory_stack.rs @@ -239,8 +239,7 @@ impl DirectoryStack { } (Err(err), _) => Err(Cow::Owned(format!( "ion: failed to set current dir to {}: {}\n", - dir, - err + dir, err ))), (..) => Err(Cow::Borrowed( "ion: change_and_push_dir(): error occurred that should never happen\n", @@ -329,9 +328,7 @@ impl DirectoryStack { SUCCESS } - pub(crate) fn dir_from_top(&self, num: usize) -> Option<&PathBuf> { - self.dirs.get(num) - } + pub(crate) fn dir_from_top(&self, num: usize) -> Option<&PathBuf> { self.dirs.get(num) } pub(crate) fn dir_from_bottom(&self, num: usize) -> Option<&PathBuf> { self.dirs.iter().rev().nth(num) @@ -353,8 +350,7 @@ impl DirectoryStack { let dir = self.dirs.iter().nth(index).ok_or_else(|| { Cow::Owned(format!( "ion: {}: {}: directory stack out of range\n", - caller, - index + caller, index )) })?; diff --git a/src/shell/flags.rs b/src/shell/flags.rs index 9dcb63b99ee10b6b658e3f136dd02e3b7ace0550..430ef9826070bb413f49af93f297e7b8a877bf90 100644 --- a/src/shell/flags.rs +++ b/src/shell/flags.rs @@ -1,4 +1,4 @@ pub const ERR_EXIT: u8 = 1; pub const PRINT_COMMS: u8 = 2; pub const NO_EXEC: u8 = 4; -pub const HUPONEXIT: u8 = 8; \ No newline at end of file +pub const HUPONEXIT: u8 = 8; diff --git a/src/shell/flow.rs b/src/shell/flow.rs index 881499fdaf3eeb468a19827dd8ce49fdf781fef7..4930bef3a36760647a523f28165751657c3d48f4 100644 --- a/src/shell/flow.rs +++ b/src/shell/flow.rs @@ -1,7 +1,6 @@ use super::Shell; use super::flags::*; -use super::flow_control::{collect_cases, collect_if, collect_loops, Case, ElseIf, Function, - Statement}; +use super::flow_control::{collect_cases, collect_if, collect_loops, Case, ElseIf, Function, Statement}; use super::job_control::JobControl; use super::status::*; use parser::{expand_string, parse_and_validate, ForExpression, StatementSplitter}; @@ -669,8 +668,8 @@ impl FlowLogic for Shell { } else { // Store the partial `Statement::For` to memory self.flow_control.current_statement = Statement::For { - variable: variable, - values: values, + variable: variable, + values: values, statements: statements, } } @@ -705,9 +704,9 @@ impl FlowLogic for Shell { self.flow_control.current_if_mode = mode; self.flow_control.current_statement = Statement::If { expression: expression, - success: success, - else_if: else_if, - failure: failure, + success: success, + else_if: else_if, + failure: failure, }; } } @@ -734,9 +733,9 @@ impl FlowLogic for Shell { // Store the partial function declaration in memory. self.flow_control.current_statement = Statement::Function { description: description, - name: name, - args: args, - statements: statements, + name: name, + args: args, + statements: statements, } } } diff --git a/src/shell/flow_control.rs b/src/shell/flow_control.rs index 663774d131a1e9bdd0021ff24f7e2136ff2ac83c..298cfbf13bab3db93b43338d2974e8c3b9032aa3 100644 --- a/src/shell/flow_control.rs +++ b/src/shell/flow_control.rs @@ -10,7 +10,7 @@ use types::Identifier; #[derive(Debug, PartialEq, Clone)] pub(crate) struct ElseIf { pub expression: Pipeline, - pub success: Vec<Statement>, + pub success: Vec<Statement>, } /// Represents a single branch in a match statement. For example, in the expression @@ -35,10 +35,10 @@ pub(crate) struct ElseIf { /// ``` #[derive(Debug, PartialEq, Clone)] pub(crate) struct Case { - pub value: Option<String>, - pub binding: Option<String>, + pub value: Option<String>, + pub binding: Option<String>, pub conditional: Option<String>, - pub statements: Vec<Statement>, + pub statements: Vec<Statement>, } #[derive(Debug, PartialEq, Clone)] @@ -62,20 +62,20 @@ pub(crate) enum Statement { Export(ExportAction), If { expression: Pipeline, - success: Vec<Statement>, - else_if: Vec<ElseIf>, - failure: Vec<Statement>, + success: Vec<Statement>, + else_if: Vec<ElseIf>, + failure: Vec<Statement>, }, ElseIf(ElseIf), Function { - name: Identifier, + name: Identifier, description: Option<String>, - args: Vec<KeyBuf>, - statements: Vec<Statement>, + args: Vec<KeyBuf>, + statements: Vec<Statement>, }, For { - variable: Identifier, - values: Vec<String>, + variable: Identifier, + values: Vec<String>, statements: Vec<Statement>, }, While { @@ -84,7 +84,7 @@ pub(crate) enum Statement { }, Match { expression: String, - cases: Vec<Case>, + cases: Vec<Case>, }, Else, End, @@ -121,17 +121,17 @@ impl Statement { } pub(crate) struct FlowControl { - pub level: usize, + pub level: usize, pub current_statement: Statement, - pub current_if_mode: u8, // { 0 = SUCCESS; 1 = FAILURE } + pub current_if_mode: u8, // { 0 = SUCCESS; 1 = FAILURE } } impl Default for FlowControl { fn default() -> FlowControl { FlowControl { - level: 0, + level: 0, current_statement: Statement::Default, - current_if_mode: 0, + current_if_mode: 0, } } } @@ -139,9 +139,9 @@ impl Default for FlowControl { #[derive(Clone)] pub struct Function { description: Option<String>, - name: Identifier, - args: Vec<KeyBuf>, - statements: Vec<Statement>, + name: Identifier, + args: Vec<KeyBuf>, + statements: Vec<Statement>, } #[derive(Debug, PartialEq, Clone)] @@ -175,9 +175,7 @@ impl Function { } } - pub(crate) fn get_description<'a>(&'a self) -> Option<&'a String> { - self.description.as_ref() - } + pub(crate) fn get_description<'a>(&'a self) -> Option<&'a String> { self.description.as_ref() } pub(crate) fn execute(self, shell: &mut Shell, args: &[&str]) -> Result<(), FunctionError> { if args.len() - 1 != self.args.len() { diff --git a/src/shell/fork.rs b/src/shell/fork.rs index 86cac8a3365a0698644f2318f9b416d649a0e98a..761eb8ed515b340a2dd0ddd72929c6accab69be0 100644 --- a/src/shell/fork.rs +++ b/src/shell/fork.rs @@ -24,7 +24,7 @@ pub enum Capture { /// /// Using this structure directly is equivalent to using `Shell`'s fork method. pub struct Fork<'a> { - shell: &'a Shell, + shell: &'a Shell, capture: Capture, } @@ -34,16 +34,14 @@ pub struct Fork<'a> { /// in the future, once there's a better means of obtaining the exit status without having to /// wait on the PID. pub struct IonResult { - pub pid: u32, + pub pid: u32, pub stdout: Option<File>, pub stderr: Option<File>, } impl<'a> Fork<'a> { /// Creates a new `Fork` state from an existing shell. - pub fn new(shell: &'a Shell, capture: Capture) -> Fork<'a> { - Fork { shell, capture } - } + pub fn new(shell: &'a Shell, capture: Capture) -> Fork<'a> { Fork { shell, capture } } /// Executes a closure within the child of the fork, and returning an `IonResult` in a /// non-blocking fashion. diff --git a/src/shell/history.rs b/src/shell/history.rs index bbdb0a10a7b41cd5fe2479271781738919424656..2feb45015706333de7c8127c5fae5d0314ded011 100644 --- a/src/shell/history.rs +++ b/src/shell/history.rs @@ -28,7 +28,7 @@ pub(crate) struct IgnoreSetting { impl IgnoreSetting { pub(crate) fn default() -> IgnoreSetting { IgnoreSetting { - flags: IgnoreFlags::empty(), + flags: IgnoreFlags::empty(), regexes: None, } } diff --git a/src/shell/job.rs b/src/shell/job.rs index 3d2c7b91306cb9630681d399abeb9d699a226379..d905ce7605648af98eb434b2f174bba693ae4099 100644 --- a/src/shell/job.rs +++ b/src/shell/job.rs @@ -22,8 +22,8 @@ pub(crate) enum JobKind { #[derive(Clone)] pub(crate) struct Job { pub command: Identifier, - pub args: Array, - pub kind: JobKind, + pub args: Array, + pub kind: JobKind, pub builtin: Option<BuiltinFunction>, } @@ -60,9 +60,7 @@ impl fmt::Debug for Job { write!( f, "Job {{ command: {}, args: {:?}, kind: {:?} }}", - self.command, - self.args, - self.kind + self.command, self.args, self.kind ) } } @@ -111,8 +109,8 @@ pub(crate) enum RefinedJob { /// Represents redirection into stdin from more than one source Cat { sources: Vec<File>, - stdin: Option<File>, - stdout: Option<File>, + stdin: Option<File>, + stdout: Option<File>, }, Tee { /// 0 for stdout, 1 for stderr @@ -234,8 +232,8 @@ impl RefinedJob { pub(crate) fn tee(tee_out: Option<TeeItem>, tee_err: Option<TeeItem>) -> Self { RefinedJob::Tee { - items: (tee_out, tee_err), - stdin: None, + items: (tee_out, tee_err), + stdin: None, stdout: None, stderr: None, } diff --git a/src/shell/mod.rs b/src/shell/mod.rs index c3755e5a9f6fe3adf39564cceae64ca9412d76c0..9da6cc93bd07abb53cf854040783432c5cf4cb3e 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -33,9 +33,9 @@ use self::variables::Variables; use builtins::{BuiltinMap, BUILTINS}; use fnv::FnvHashMap; use liner::Context; +use parser::{ArgumentSplitter, Expander, Select}; use parser::Terminator; use parser::pipelines::Pipeline; -use parser::{ArgumentSplitter, Expander, Select}; use smallvec::SmallVec; use std::env; use std::fs::File; @@ -44,8 +44,8 @@ use std::iter::FromIterator; use std::ops::Deref; use std::path::Path; use std::process; -use std::sync::atomic::Ordering; use std::sync::{Arc, Mutex}; +use std::sync::atomic::Ordering; use std::time::SystemTime; use sys; use types::*; @@ -112,22 +112,22 @@ impl<'a> Shell { /// Panics if DirectoryStack construction fails pub(crate) fn new_bin() -> Shell { Shell { - builtins: BUILTINS, - context: None, - variables: Variables::default(), - flow_control: FlowControl::default(), - directory_stack: DirectoryStack::new(), - functions: FnvHashMap::default(), - previous_job: !0, - previous_status: 0, - flags: 0, - foreground: Vec::new(), - background: Arc::new(Mutex::new(Vec::new())), + builtins: BUILTINS, + context: None, + variables: Variables::default(), + flow_control: FlowControl::default(), + directory_stack: DirectoryStack::new(), + functions: FnvHashMap::default(), + previous_job: !0, + previous_status: 0, + flags: 0, + foreground: Vec::new(), + background: Arc::new(Mutex::new(Vec::new())), is_background_shell: false, - is_library: false, - break_flow: false, - foreground_signals: Arc::new(ForegroundSignals::new()), - ignore_setting: IgnoreSetting::default(), + is_library: false, + break_flow: false, + foreground_signals: Arc::new(ForegroundSignals::new()), + ignore_setting: IgnoreSetting::default(), } } @@ -135,22 +135,22 @@ impl<'a> Shell { /// Creates a new shell within memory. pub fn new() -> Shell { Shell { - builtins: BUILTINS, - context: None, - variables: Variables::default(), - flow_control: FlowControl::default(), - directory_stack: DirectoryStack::new(), - functions: FnvHashMap::default(), - previous_job: !0, - previous_status: 0, - flags: 0, - foreground: Vec::new(), - background: Arc::new(Mutex::new(Vec::new())), + builtins: BUILTINS, + context: None, + variables: Variables::default(), + flow_control: FlowControl::default(), + directory_stack: DirectoryStack::new(), + functions: FnvHashMap::default(), + previous_job: !0, + previous_status: 0, + flags: 0, + foreground: Vec::new(), + background: Arc::new(Mutex::new(Vec::new())), is_background_shell: false, - is_library: true, - break_flow: false, - foreground_signals: Arc::new(ForegroundSignals::new()), - ignore_setting: IgnoreSetting::default(), + is_library: true, + break_flow: false, + foreground_signals: Arc::new(ForegroundSignals::new()), + ignore_setting: IgnoreSetting::default(), } } @@ -293,8 +293,7 @@ impl<'a> Shell { eprintln!( "ion: function argument has invalid type: expected {}, found value \ \'{}\'", - expected_type, - value + expected_type, value ); Some(FAILURE) } @@ -335,14 +334,10 @@ impl<'a> Shell { /// Sets a variable of `name` with the given `value` in the shell's /// variable map. - pub fn set_var(&mut self, name: &str, value: &str) { - self.variables.set_var(name, value); - } + pub fn set_var(&mut self, name: &str, value: &str) { self.variables.set_var(name, value); } /// Gets a string variable, if it exists within the shell's variable map. - pub fn get_var(&self, name: &str) -> Option<String> { - self.variables.get_var(name) - } + pub fn get_var(&self, name: &str) -> Option<String> { self.variables.get_var(name) } /// Obtains a variable, returning an empty string if it does not exist. pub(crate) fn get_var_or_empty(&self, name: &str) -> String { @@ -459,9 +454,11 @@ impl<'a> Expander for Shell { if found.is_none() { found = match self.variables.get_map(array) { Some(map) => match selection { - Select::All => { - Some(map.iter().map(|(_, value)| value.clone()).collect::<Array>()) - } + Select::All => Some( + map.iter() + .map(|(_, value)| value.clone()) + .collect::<Array>(), + ), Select::Key(ref key) => { Some(array![map.get(key.get()).unwrap_or(&"".into()).clone()]) } diff --git a/src/shell/pipe_exec/foreground.rs b/src/shell/pipe_exec/foreground.rs index d69bcd466a0d2a0eae52bbe15430789766bee6c6..ff76295d246f679939f87422a5ed65bfced65d72 100644 --- a/src/shell/pipe_exec/foreground.rs +++ b/src/shell/pipe_exec/foreground.rs @@ -15,23 +15,21 @@ const ERRORED: u8 = 2; /// structure to notify a background thread that it needs to wait for and return /// the exit status back to the `fg` function. pub(crate) struct ForegroundSignals { - grab: AtomicU32, + grab: AtomicU32, status: AtomicU8, - reply: AtomicU8, + reply: AtomicU8, } impl ForegroundSignals { pub(crate) fn new() -> ForegroundSignals { ForegroundSignals { - grab: AtomicU32::new(0), + grab: AtomicU32::new(0), status: AtomicU8::new(0), - reply: AtomicU8::new(0), + reply: AtomicU8::new(0), } } - pub(crate) fn signal_to_grab(&self, pid: u32) { - self.grab.store(pid, Ordering::Relaxed); - } + pub(crate) fn signal_to_grab(&self, pid: u32) { self.grab.store(pid, Ordering::Relaxed); } pub(crate) fn reply_with(&self, status: i8) { self.grab.store(0, Ordering::Relaxed); @@ -58,7 +56,5 @@ impl ForegroundSignals { } } - pub(crate) fn was_grabbed(&self, pid: u32) -> bool { - self.grab.load(Ordering::Relaxed) == pid - } + pub(crate) fn was_grabbed(&self, pid: u32) -> bool { self.grab.load(Ordering::Relaxed) == pid } } diff --git a/src/shell/pipe_exec/fork.rs b/src/shell/pipe_exec/fork.rs index 8b6fed4e12b8be78623c80514db85f4d61316a47..4b9616266e77990d9b3814ebd8ed42928c9789d3 100644 --- a/src/shell/pipe_exec/fork.rs +++ b/src/shell/pipe_exec/fork.rs @@ -1,9 +1,7 @@ use sys; /// Ensures that the forked child is given a unique process ID. -pub(crate) fn create_process_group(pgid: u32) { - let _ = sys::setpgid(0, pgid); -} +pub(crate) fn create_process_group(pgid: u32) { let _ = sys::setpgid(0, pgid); } use super::job_control::{JobControl, ProcessState}; use super::pipe; @@ -18,7 +16,7 @@ pub(crate) fn fork_pipe( shell: &mut Shell, commands: Vec<(RefinedJob, JobKind)>, command_name: String, - state: ProcessState + state: ProcessState, ) -> i32 { match unsafe { sys::fork() } { Ok(0) => { diff --git a/src/shell/pipe_exec/job_control.rs b/src/shell/pipe_exec/job_control.rs index aab408fef01f4d2b1733ec3e7e381bb12a477fb1..e5fe69eb2bec35821a1561165c3102bc0bc66953 100644 --- a/src/shell/pipe_exec/job_control.rs +++ b/src/shell/pipe_exec/job_control.rs @@ -77,20 +77,20 @@ pub(crate) fn add_to_background( { Some(id) => { (*processes)[id] = BackgroundProcess { - pid: pid, + pid: pid, ignore_sighup: false, - state: state, - name: command, + state: state, + name: command, }; id as u32 } None => { let njobs = (*processes).len(); (*processes).push(BackgroundProcess { - pid: pid, + pid: pid, ignore_sighup: false, - state: state, - name: command, + state: state, + name: command, }); njobs as u32 } @@ -103,10 +103,10 @@ pub(crate) fn add_to_background( /// as the process ID, state that the process is in, and the command that the /// process is executing. pub struct BackgroundProcess { - pub pid: u32, + pub pid: u32, pub ignore_sighup: bool, - pub state: ProcessState, - pub name: String, + pub state: ProcessState, + pub name: String, } impl JobControl for Shell { diff --git a/src/shell/pipe_exec/mod.rs b/src/shell/pipe_exec/mod.rs index 6f2856e053b6c9876baa2d9ddda67b4f4c09ca38..8fb20e9f9cc25e736ea1392d23c252a470c9ebfd 100644 --- a/src/shell/pipe_exec/mod.rs +++ b/src/shell/pipe_exec/mod.rs @@ -225,7 +225,6 @@ fn do_redirection(piped_commands: Vec<RefinedItem>) -> Option<Vec<(RefinedJob, J }} } - // Real logic begins here let mut new_commands = Vec::new(); let mut prev_kind = JobKind::And; @@ -273,11 +272,11 @@ fn do_redirection(piped_commands: Vec<RefinedItem>) -> Option<Vec<(RefinedJob, J // tee both (true, true) => { let mut tee_out = TeeItem { - sinks: Vec::new(), + sinks: Vec::new(), source: None, }; let mut tee_err = TeeItem { - sinks: Vec::new(), + sinks: Vec::new(), source: None, }; for output in outputs { @@ -302,8 +301,7 @@ fn do_redirection(piped_commands: Vec<RefinedItem>) -> Option<Vec<(RefinedJob, J eprintln!( "ion: failed to redirect both stdout and stderr to file \ '{:?}': {}", - f, - e + f, e ); return None; } @@ -433,11 +431,16 @@ impl PipelineExecution for Shell { // If the given pipeline is a background task, fork the shell. if let Some((command_name, disown)) = possible_background_name { - fork_pipe(self, piped_commands, command_name, if disown { - ProcessState::Empty - } else { - ProcessState::Running - }) + fork_pipe( + self, + piped_commands, + command_name, + if disown { + ProcessState::Empty + } else { + ProcessState::Running + }, + ) } else { // While active, the SIGTTOU signal will be ignored. let _sig_ignore = SignalHandler::new(); @@ -502,9 +505,11 @@ impl PipelineExecution for Shell { pgid, last_pid, move || as_string, - move |pid| if let Some(id) = children.iter().position(|&x| x as i32 == pid) { - commands.remove(id); - children.remove(id); + move |pid| { + if let Some(id) = children.iter().position(|&x| x as i32 == pid) { + commands.remove(id); + children.remove(id); + } }, ) } @@ -629,8 +634,7 @@ impl PipelineExecution for Shell { Err(FunctionError::InvalidArgumentType(expected_type, value)) => { eprintln!( "ion: function argument has invalid type: expected {}, found value \'{}\'", - expected_type, - value + expected_type, value ); FAILURE } diff --git a/src/shell/plugins/library_iter/redox.rs b/src/shell/plugins/library_iter/redox.rs index 402b237b114a5eb732ba00a5ae00df9c5f31f365..61fed872efafc8999de48645b17372e2241b6945 100644 --- a/src/shell/plugins/library_iter/redox.rs +++ b/src/shell/plugins/library_iter/redox.rs @@ -9,9 +9,7 @@ pub(crate) struct LibraryIterator { } impl LibraryIterator { - pub(crate) fn new(directory: ReadDir) -> LibraryIterator { - LibraryIterator { directory } - } + pub(crate) fn new(directory: ReadDir) -> LibraryIterator { LibraryIterator { directory } } } impl Iterator for LibraryIterator { @@ -19,7 +17,5 @@ impl Iterator for LibraryIterator { // The `Library` is a handle to dynamic library loaded into memory. type Item = (Identifier, Library); - fn next(&mut self) -> Option<(Identifier, Library)> { - None - } + fn next(&mut self) -> Option<(Identifier, Library)> { None } } diff --git a/src/shell/plugins/library_iter/unix.rs b/src/shell/plugins/library_iter/unix.rs index 17a313f810f4a2e9d3ee533fa8fec40a8cbc0548..79e9a37de72f707f1de9d715902ca06f747944e6 100644 --- a/src/shell/plugins/library_iter/unix.rs +++ b/src/shell/plugins/library_iter/unix.rs @@ -8,9 +8,7 @@ pub(crate) struct LibraryIterator { } impl LibraryIterator { - pub(crate) fn new(directory: ReadDir) -> LibraryIterator { - LibraryIterator { directory } - } + pub(crate) fn new(directory: ReadDir) -> LibraryIterator { LibraryIterator { directory } } } impl Iterator for LibraryIterator { diff --git a/src/shell/plugins/methods/redox.rs b/src/shell/plugins/methods/redox.rs index c082e7db8f265fae6eabb1fdf14343e4eac61730..0f77cb0eddbd32c34f7d7bcb69a9e82afaf82a68 100644 --- a/src/shell/plugins/methods/redox.rs +++ b/src/shell/plugins/methods/redox.rs @@ -9,9 +9,7 @@ pub(crate) enum MethodArguments { pub(crate) struct StringMethodPlugins; impl StringMethodPlugins { - pub(crate) fn new() -> StringMethodPlugins { - StringMethodPlugins - } + pub(crate) fn new() -> StringMethodPlugins { StringMethodPlugins } pub(crate) fn execute( &self, @@ -26,6 +24,4 @@ impl StringMethodPlugins { /// /// This function is meant to be called with `lazy_static` to ensure that there isn't a /// cost to collecting all this information when the shell never uses it in the first place! -pub(crate) fn collect() -> StringMethodPlugins { - StringMethodPlugins::new() -} +pub(crate) fn collect() -> StringMethodPlugins { StringMethodPlugins::new() } diff --git a/src/shell/plugins/methods/unix.rs b/src/shell/plugins/methods/unix.rs index 3e7d55641b514c1546d0b881aa468a125e47a79c..e365fb4c7aa760214883d94546e60ade3aeac478 100644 --- a/src/shell/plugins/methods/unix.rs +++ b/src/shell/plugins/methods/unix.rs @@ -15,11 +15,11 @@ use types::Identifier; /// corresponding field to `NULL`. Libraries importing this structure should check for nullness. #[repr(C)] pub(crate) struct RawMethodArguments { - key_ptr: *mut c_char, + key_ptr: *mut c_char, key_array_ptr: *mut *mut c_char, - args_ptr: *mut *mut c_char, - key_len: usize, - args_len: usize, + args_ptr: *mut *mut c_char, + key_len: usize, + args_len: usize, } pub(crate) enum MethodArguments { @@ -82,11 +82,11 @@ impl From<MethodArguments> for RawMethodArguments { } } MethodArguments::NoArgs => RawMethodArguments { - key_ptr: ptr::null_mut(), + key_ptr: ptr::null_mut(), key_array_ptr: ptr::null_mut(), - args_ptr: ptr::null_mut(), - key_len: 0, - args_len: 0, + args_ptr: ptr::null_mut(), + key_len: 0, + args_len: 0, }, } } @@ -112,7 +112,7 @@ impl StringMethodPlugins { pub(crate) fn new() -> StringMethodPlugins { StringMethodPlugins { libraries: Vec::new(), - symbols: FnvHashMap::default(), + symbols: FnvHashMap::default(), } } diff --git a/src/shell/plugins/namespaces/redox.rs b/src/shell/plugins/namespaces/redox.rs index 3f9fc0505e441fbfb3ec2dbeb7e1d79c47ac8e49..480b69cee57d95017a98adb5d3a266198af4cfe7 100644 --- a/src/shell/plugins/namespaces/redox.rs +++ b/src/shell/plugins/namespaces/redox.rs @@ -6,9 +6,7 @@ use types::Identifier; pub(crate) struct StringNamespace; impl StringNamespace { - pub(crate) fn new() -> Result<StringNamespace, StringError> { - Ok(StringNamespace) - } + pub(crate) fn new() -> Result<StringNamespace, StringError> { Ok(StringNamespace) } pub(crate) fn execute(&self, _function: Identifier) -> Result<Option<String>, StringError> { Ok(None) diff --git a/src/shell/signals.rs b/src/shell/signals.rs index bbf8fde079017eaeb814d25e2369e1b666aaebd0..e5bf743bbd144e191aefbbe60594a150e9e7ae4d 100644 --- a/src/shell/signals.rs +++ b/src/shell/signals.rs @@ -15,14 +15,10 @@ pub const SIGHUP: u8 = 2; pub const SIGTERM: u8 = 4; /// Suspends a given process by it's process ID. -pub(crate) fn suspend(pid: u32) { - let _ = sys::killpg(pid, sys::SIGSTOP); -} +pub(crate) fn suspend(pid: u32) { let _ = sys::killpg(pid, sys::SIGSTOP); } /// Resumes a given process by it's process ID. -pub(crate) fn resume(pid: u32) { - let _ = sys::killpg(pid, sys::SIGCONT); -} +pub(crate) fn resume(pid: u32) { let _ = sys::killpg(pid, sys::SIGCONT); } /// The purpose of the signal handler is to ignore signals when it is active, and then continue /// listening to signals once the handler is dropped. @@ -36,7 +32,5 @@ impl SignalHandler { } impl Drop for SignalHandler { - fn drop(&mut self) { - unblock(); - } + fn drop(&mut self) { unblock(); } } diff --git a/src/shell/status.rs b/src/shell/status.rs index 6f99c27dd0b281b4efe2614e917d73ec2def5188..65d0b1ef980c9dc25fbbd08d9fb91aa77e1b6c90 100644 --- a/src/shell/status.rs +++ b/src/shell/status.rs @@ -5,6 +5,4 @@ pub const COULD_NOT_EXEC: i32 = 126; pub const NO_SUCH_COMMAND: i32 = 127; pub const TERMINATED: i32 = 143; -pub fn get_signal_code(signal: i32) -> i32 { - 128 + signal -} +pub fn get_signal_code(signal: i32) -> i32 { 128 + signal } diff --git a/src/shell/variables/mod.rs b/src/shell/variables/mod.rs index 1ccecce4873397a8c42e02f92e989c3fec62e48b..26633b6a409d1447d57ad4e66452681e890c556d 100644 --- a/src/shell/variables/mod.rs +++ b/src/shell/variables/mod.rs @@ -6,10 +6,12 @@ use fnv::FnvHashMap; use liner::Context; use std::env; use std::io::{self, BufRead}; -use sys::variables as self_sys; use sys::{self, getpid, is_root}; -use types::{Array, ArrayVariableContext, HashMap, HashMapVariableContext, Identifier, Key, Value, - VariableContext}; +use sys::variables as self_sys; +use types::{ + Array, ArrayVariableContext, HashMap, HashMapVariableContext, Identifier, Key, Value, + VariableContext, +}; use unicode_segmentation::UnicodeSegmentation; use xdg::BaseDirectories; @@ -19,11 +21,11 @@ lazy_static! { #[derive(Clone, Debug)] pub struct Variables { - pub hashmaps: HashMapVariableContext, - pub arrays: ArrayVariableContext, + pub hashmaps: HashMapVariableContext, + pub arrays: ArrayVariableContext, pub variables: VariableContext, - pub aliases: VariableContext, - flags: u8, + pub aliases: VariableContext, + flags: u8, } impl Default for Variables { @@ -34,7 +36,10 @@ impl Default for Variables { map.insert("HISTFILE_SIZE".into(), "1000".into()); map.insert( "PROMPT".into(), - "${x::1B}]0;${USER}: ${PWD}${x::07}${c::0x55,bold}${USER}${c::default}:${c::0x4B}${SWD}${c::default}# ${c::reset}".into(), + "${x::1B}]0;${USER}: \ + ${PWD}${x::07}${c::0x55,bold}${USER}${c::default}:${c::0x4B}${SWD}${c::default}# \ + ${c::reset}" + .into(), ); // Set the PID variable to the PID of the shell let pid = getpid() @@ -62,11 +67,11 @@ impl Default for Variables { |path| env::set_var("HOME", path.to_str().unwrap_or("?")), ); Variables { - hashmaps: FnvHashMap::with_capacity_and_hasher(64, Default::default()), - arrays: FnvHashMap::with_capacity_and_hasher(64, Default::default()), + hashmaps: FnvHashMap::with_capacity_and_hasher(64, Default::default()), + arrays: FnvHashMap::with_capacity_and_hasher(64, Default::default()), variables: map, - aliases: FnvHashMap::with_capacity_and_hasher(64, Default::default()), - flags: 0, + aliases: FnvHashMap::with_capacity_and_hasher(64, Default::default()), + flags: 0, } } } @@ -74,17 +79,11 @@ impl Default for Variables { const PLUGIN: u8 = 1; impl Variables { - pub(crate) fn has_plugin_support(&self) -> bool { - self.flags & PLUGIN != 0 - } + pub(crate) fn has_plugin_support(&self) -> bool { self.flags & PLUGIN != 0 } - pub(crate) fn enable_plugins(&mut self) { - self.flags |= PLUGIN; - } + pub(crate) fn enable_plugins(&mut self) { self.flags |= PLUGIN; } - pub(crate) fn disable_plugins(&mut self) { - self.flags &= 255 ^ PLUGIN; - } + pub(crate) fn disable_plugins(&mut self) { self.flags &= 255 ^ PLUGIN; } pub(crate) fn read<I: IntoIterator>(&mut self, args: I) -> i32 where @@ -155,17 +154,11 @@ impl Variables { } } - pub fn get_map(&self, name: &str) -> Option<&HashMap> { - self.hashmaps.get(name) - } + pub fn get_map(&self, name: &str) -> Option<&HashMap> { self.hashmaps.get(name) } - pub fn get_array(&self, name: &str) -> Option<&Array> { - self.arrays.get(name) - } + pub fn get_array(&self, name: &str) -> Option<&Array> { self.arrays.get(name) } - pub fn unset_array(&mut self, name: &str) -> Option<Array> { - self.arrays.remove(name) - } + pub fn unset_array(&mut self, name: &str) -> Option<Array> { self.arrays.remove(name) } /// Obtains the value for the **SWD** variable. /// @@ -224,9 +217,7 @@ impl Variables { match name { "c" | "color" => Colors::collect(variable).into_string(), "x" | "hex" => match u8::from_str_radix(variable, 16) { - Ok(c) => { - Some((c as char).to_string()) - }, + Ok(c) => Some((c as char).to_string()), Err(why) => { eprintln!("ion: hex parse error: {}: {}", variable, why); None @@ -274,13 +265,9 @@ impl Variables { } } - pub fn get_var_or_empty(&self, name: &str) -> Value { - self.get_var(name).unwrap_or_default() - } + pub fn get_var_or_empty(&self, name: &str) -> Value { self.get_var(name).unwrap_or_default() } - pub fn unset_var(&mut self, name: &str) -> Option<Value> { - self.variables.remove(name) - } + pub fn unset_var(&mut self, name: &str) -> Option<Value> { self.variables.remove(name) } pub fn get_vars<'a>(&'a self) -> impl Iterator<Item = Identifier> + 'a { self.variables @@ -392,9 +379,7 @@ mod tests { struct VariableExpander(pub Variables); impl Expander for VariableExpander { - fn variable(&self, var: &str, _: bool) -> Option<Value> { - self.0.get_var(var) - } + fn variable(&self, var: &str, _: bool) -> Option<Value> { self.0.get_var(var) } } #[test] diff --git a/src/sys/redox.rs b/src/sys/redox.rs index 5e950ff130428e18c39dbfca159b93c825d1559f..3746becf1062c18a4928ef7ceddab04478d350ab 100644 --- a/src/sys/redox.rs +++ b/src/sys/redox.rs @@ -22,17 +22,11 @@ pub(crate) const STDIN_FILENO: RawFd = 0; pub(crate) const STDOUT_FILENO: RawFd = 1; pub(crate) const STDERR_FILENO: RawFd = 2; -pub(crate) fn is_root() -> bool { - syscall::geteuid().map(|id| id == 0).unwrap_or(false) -} +pub(crate) fn is_root() -> bool { syscall::geteuid().map(|id| id == 0).unwrap_or(false) } -pub unsafe fn fork() -> io::Result<u32> { - cvt(syscall::clone(0)).map(|pid| pid as u32) -} +pub unsafe fn fork() -> io::Result<u32> { cvt(syscall::clone(0)).map(|pid| pid as u32) } -pub(crate) fn getpid() -> io::Result<u32> { - cvt(syscall::getpid()).map(|pid| pid as u32) -} +pub(crate) fn getpid() -> io::Result<u32> { cvt(syscall::getpid()).map(|pid| pid as u32) } pub(crate) fn kill(pid: u32, signal: i32) -> io::Result<()> { cvt(syscall::kill(pid as usize, signal as usize)).and(Ok(())) @@ -105,8 +99,8 @@ pub(crate) fn execve(prog: &str, args: &[&str], clear_env: bool) -> io::Result<( pub(crate) fn signal(signal: i32, handler: extern "C" fn(i32)) -> io::Result<()> { let new = SigAction { sa_handler: unsafe { mem::transmute(handler) }, - sa_mask: [0; 2], - sa_flags: 0, + sa_mask: [0; 2], + sa_flags: 0, }; cvt(syscall::sigaction(signal as usize, Some(&new), None)).and(Ok(())) } @@ -114,8 +108,8 @@ pub(crate) fn signal(signal: i32, handler: extern "C" fn(i32)) -> io::Result<()> pub(crate) fn reset_signal(signal: i32) -> io::Result<()> { let new = SigAction { sa_handler: unsafe { mem::transmute(syscall::flag::SIG_DFL) }, - sa_mask: [0; 2], - sa_flags: 0, + sa_mask: [0; 2], + sa_flags: 0, }; cvt(syscall::sigaction(signal as usize, Some(&new), None)).and(Ok(())) } @@ -136,17 +130,13 @@ pub(crate) fn tcsetpgrp(tty_fd: RawFd, pgid: u32) -> io::Result<()> { cvt(res).and(Ok(())) } -pub(crate) fn dup(fd: RawFd) -> io::Result<RawFd> { - cvt(syscall::dup(fd, &[])) -} +pub(crate) fn dup(fd: RawFd) -> io::Result<RawFd> { cvt(syscall::dup(fd, &[])) } pub(crate) fn dup2(old: RawFd, new: RawFd) -> io::Result<RawFd> { cvt(syscall::dup2(old, new, &[])) } -pub(crate) fn close(fd: RawFd) -> io::Result<()> { - cvt(syscall::close(fd)).and(Ok(())) -} +pub(crate) fn close(fd: RawFd) -> io::Result<()> { cvt(syscall::close(fd)).and(Ok(())) } pub(crate) fn isatty(fd: RawFd) -> bool { if let Ok(tfd) = syscall::dup(fd, b"termios") { @@ -192,7 +182,6 @@ pub mod job_control { // TODO: Implement this using syscall::call::waitpid } - pub(crate) fn watch_foreground<F, D>( shell: &mut Shell, _pid: u32, diff --git a/src/sys/unix/mod.rs b/src/sys/unix/mod.rs index 5a2e0c1837da15522a215da7d00ce30d880509ac..28ff14ea401658e05efda0812282a8c3733ff20c 100644 --- a/src/sys/unix/mod.rs +++ b/src/sys/unix/mod.rs @@ -23,17 +23,11 @@ pub(crate) const STDOUT_FILENO: i32 = libc::STDOUT_FILENO; pub(crate) const STDERR_FILENO: i32 = libc::STDERR_FILENO; pub(crate) const STDIN_FILENO: i32 = libc::STDIN_FILENO; -pub(crate) fn is_root() -> bool { - unsafe { libc::geteuid() == 0 } -} +pub(crate) fn is_root() -> bool { unsafe { libc::geteuid() == 0 } } -pub unsafe fn fork() -> io::Result<u32> { - cvt(libc::fork()).map(|pid| pid as u32) -} +pub unsafe fn fork() -> io::Result<u32> { cvt(libc::fork()).map(|pid| pid as u32) } -pub(crate) fn getpid() -> io::Result<u32> { - cvt(unsafe { libc::getpid() }).map(|pid| pid as u32) -} +pub(crate) fn getpid() -> io::Result<u32> { cvt(unsafe { libc::getpid() }).map(|pid| pid as u32) } pub(crate) fn kill(pid: u32, signal: i32) -> io::Result<()> { cvt(unsafe { libc::kill(pid as pid_t, signal as c_int) }).and(Ok(())) @@ -47,7 +41,9 @@ pub(crate) fn execve(prog: &str, args: &[&str], clear_env: bool) -> io::Result<( // Prepare the program string let prog_str = match CString::new(prog) { Ok(prog_str) => prog_str, - Err(_) => { return Err(io::Error::last_os_error()); } + Err(_) => { + return Err(io::Error::last_os_error()); + } }; // Create the arguments vector @@ -154,21 +150,15 @@ pub(crate) fn tcsetpgrp(fd: RawFd, pgrp: u32) -> io::Result<()> { cvt(unsafe { libc::tcsetpgrp(fd as c_int, pgrp as pid_t) }).and(Ok(())) } -pub(crate) fn dup(fd: RawFd) -> io::Result<RawFd> { - cvt(unsafe { libc::dup(fd) }) -} +pub(crate) fn dup(fd: RawFd) -> io::Result<RawFd> { cvt(unsafe { libc::dup(fd) }) } pub(crate) fn dup2(old: RawFd, new: RawFd) -> io::Result<RawFd> { cvt(unsafe { libc::dup2(old, new) }) } -pub(crate) fn close(fd: RawFd) -> io::Result<()> { - cvt(unsafe { libc::close(fd) }).and(Ok(())) -} +pub(crate) fn close(fd: RawFd) -> io::Result<()> { cvt(unsafe { libc::close(fd) }).and(Ok(())) } -pub(crate) fn isatty(fd: RawFd) -> bool { - unsafe { libc::isatty(fd) == 1 } -} +pub(crate) fn isatty(fd: RawFd) -> bool { unsafe { libc::isatty(fd) == 1 } } trait IsMinusOne { fn is_minus_one(&self) -> bool;