From 372e42f3509c3ec87504a054271ad1289ce3b4ac Mon Sep 17 00:00:00 2001 From: Marcin Puc Date: Fri, 10 Sep 2021 21:52:09 +0200 Subject: [PATCH] Reduce nesting in if blocks by short circuiting --- src/assets.rs | 83 ++++++++++++++++++++++----------------------- src/bin/bat/main.rs | 17 ++++------ src/input.rs | 20 +++++------ src/less.rs | 12 +++---- src/printer.rs | 32 ++++++++--------- 5 files changed, 80 insertions(+), 84 deletions(-) diff --git a/src/assets.rs b/src/assets.rs index e315a402..a15eae43 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -255,57 +255,56 @@ impl HighlightingAssets { ) -> Result { if let Some(language) = language { let syntax_set = self.get_syntax_set_by_name(language)?; - syntax_set + return syntax_set .find_syntax_by_token(language) .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }) - .ok_or_else(|| Error::UnknownSyntax(language.to_owned())) - } else { - let line_syntax = self.get_first_line_syntax(&mut input.reader)?; + .ok_or_else(|| Error::UnknownSyntax(language.to_owned())); + } - // Get the path of the file: - // If this was set by the metadata, that will take priority. - // If it wasn't, it will use the real file path (if available). - let path_str = - input - .metadata - .user_provided_name - .as_ref() - .or_else(|| match input.kind { - OpenedInputKind::OrdinaryFile(ref path) => Some(path), - _ => None, - }); + let line_syntax = self.get_first_line_syntax(&mut input.reader)?; - if let Some(path_str) = path_str { - // If a path was provided, we try and detect the syntax based on extension mappings. - let path = Path::new(path_str); - let absolute_path = PathAbs::new(path) - .ok() - .map(|p| p.as_path().to_path_buf()) - .unwrap_or_else(|| path.to_owned()); + // Get the path of the file: + // If this was set by the metadata, that will take priority. + // If it wasn't, it will use the real file path (if available). + let path_str = input + .metadata + .user_provided_name + .as_ref() + .or_else(|| match input.kind { + OpenedInputKind::OrdinaryFile(ref path) => Some(path), + _ => None, + }); - match mapping.get_syntax_for(absolute_path) { - Some(MappingTarget::MapToUnknown) => line_syntax - .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())), + if let Some(path_str) = path_str { + // If a path was provided, we try and detect the syntax based on extension mappings. + let path = Path::new(path_str); + let absolute_path = PathAbs::new(path) + .ok() + .map(|p| p.as_path().to_path_buf()) + .unwrap_or_else(|| path.to_owned()); - Some(MappingTarget::MapTo(syntax_name)) => { - let syntax_set = self.get_syntax_set()?; - syntax_set - .find_syntax_by_name(syntax_name) - .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }) - .ok_or_else(|| Error::UnknownSyntax(syntax_name.to_owned())) - } + match mapping.get_syntax_for(absolute_path) { + Some(MappingTarget::MapToUnknown) => line_syntax + .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())), - None => { - let file_name = path.file_name().unwrap_or_default(); - self.get_extension_syntax(file_name)? - .or(line_syntax) - .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())) - } + Some(MappingTarget::MapTo(syntax_name)) => { + let syntax_set = self.get_syntax_set()?; + syntax_set + .find_syntax_by_name(syntax_name) + .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }) + .ok_or_else(|| Error::UnknownSyntax(syntax_name.to_owned())) + } + + None => { + let file_name = path.file_name().unwrap_or_default(); + self.get_extension_syntax(file_name)? + .or(line_syntax) + .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())) } - } else { - // If a path wasn't provided, we fall back to the detect first-line syntax. - line_syntax.ok_or_else(|| Error::UndetectedSyntax("[unknown]".into())) } + } else { + // If a path wasn't provided, we fall back to the detect first-line syntax. + line_syntax.ok_or_else(|| Error::UndetectedSyntax("[unknown]".into())) } } diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index bc473394..938d3949 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -100,17 +100,14 @@ pub fn get_languages(config: &Config) -> Result { // Also skip if the 'extension' contains another real extension, likely // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock' if extension.starts_with('.') || Path::new(extension).extension().is_some() { - true - } else { - let test_file = Path::new("test").with_extension(extension); - let syntax_in_set = assets - .get_syntax_for_file_name(test_file, &config.syntax_mapping) - .unwrap(); // safe since .get_syntaxes() above worked - match syntax_in_set { - Some(syntax_in_set) => syntax_in_set.syntax.name == lang_name, - None => false, - } + return true; } + + let test_file = Path::new("test").with_extension(extension); + let syntax_in_set = assets + .get_syntax_for_file_name(test_file, &config.syntax_mapping) + .unwrap(); // safe since .get_syntaxes() above worked + matches!(syntax_in_set, Some(syntax_in_set) if syntax_in_set.syntax.name == lang_name) }); } diff --git a/src/input.rs b/src/input.rs index 786a9e05..e71d07f3 100644 --- a/src/input.rs +++ b/src/input.rs @@ -256,18 +256,18 @@ impl<'a> InputReader<'a> { } pub(crate) fn read_line(&mut self, buf: &mut Vec) -> io::Result { - if self.first_line.is_empty() { - let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?; - - if self.content_type == Some(ContentType::UTF_16LE) { - self.inner.read_until(0x00, buf).ok(); - } - - Ok(res) - } else { + if !self.first_line.is_empty() { buf.append(&mut self.first_line); - Ok(true) + return Ok(true); } + + let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?; + + if self.content_type == Some(ContentType::UTF_16LE) { + let _ = self.inner.read_until(0x00, buf); + } + + Ok(res) } } diff --git a/src/less.rs b/src/less.rs index 2575fe18..9de6d508 100644 --- a/src/less.rs +++ b/src/less.rs @@ -11,13 +11,13 @@ pub fn retrieve_less_version(less_path: &dyn AsRef) -> Option { } fn parse_less_version(output: &[u8]) -> Option { - if output.starts_with(b"less ") { - let version = std::str::from_utf8(&output[5..]).ok()?; - let end = version.find(|c: char| !c.is_ascii_digit())?; - version[..end].parse::().ok() - } else { - None + if !output.starts_with(b"less ") { + return None; } + + let version = std::str::from_utf8(&output[5..]).ok()?; + let end = version.find(|c: char| !c.is_ascii_digit())?; + version[..end].parse::().ok() } #[test] diff --git a/src/printer.rs b/src/printer.rs index 3dfd5a5a..6087c30b 100644 --- a/src/printer.rs +++ b/src/printer.rs @@ -226,29 +226,29 @@ impl<'a> InteractivePrinter<'a> { fn create_fake_panel(&self, text: &str) -> String { if self.panel_width == 0 { - "".to_string() + return "".to_string(); + } + + let text_truncated: String = text.chars().take(self.panel_width - 1).collect(); + let text_filled: String = format!( + "{}{}", + text_truncated, + " ".repeat(self.panel_width - 1 - text_truncated.len()) + ); + if self.config.style_components.grid() { + format!("{} │ ", text_filled) } else { - let text_truncated: String = text.chars().take(self.panel_width - 1).collect(); - let text_filled: String = format!( - "{}{}", - text_truncated, - " ".repeat(self.panel_width - 1 - text_truncated.len()) - ); - if self.config.style_components.grid() { - format!("{} │ ", text_filled) - } else { - text_filled - } + text_filled } } fn preprocess(&self, text: &str, cursor: &mut usize) -> String { if self.config.tab_width > 0 { - expand_tabs(text, self.config.tab_width, cursor) - } else { - *cursor += text.len(); - text.to_string() + return expand_tabs(text, self.config.tab_width, cursor); } + + *cursor += text.len(); + text.to_string() } }