Add Lint
Lint refers to a tool or program that analyzes source code to find and report issues related to programming style, potential errors, and adherence to coding standards. The term "lint" originates from the name of a Unix utility called "lint" that was used to identify bugs and errors in C programming code.
Using linting tools in a Rust project is a good practice for maintaining code quality and consistency. Linting tools analyze your code for potential errors, style issues, and adherence to coding standards.
Usually, developers use clippy
to lint a Rust project.
If you don't have it, install it using:
rustup update
rustup component add clippy
Know more about rustup at: https://rustup.rs/
Run the linting:
cargo clippy
You will get a list of lint issues:
Checking lr_grustep v0.1.0 (.../lr_grustep)
warning: this expression creates a reference which is immediately dereferenced by the compiler
--> src/lib.rs:61:40
|
61 | let result = grep(pattern, &file_path, options)?;
| ^^^^^^^^^^ help: change this to: `file_path`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
= note: `#[warn(clippy::needless_borrow)]` on by default
warning: `filter_map()` will run forever if the iterator repeatedly produces an `Err`
--> src/lib.rs:71:23
|
71 | Ok(reader.lines().filter_map(|line| line.ok()).collect())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `map_while(Result::ok)`
|
note: this expression returning a `std::io::Lines` may produce an infinite number of `Err` in case of a read error
--> src/lib.rs:71:8
|
71 | Ok(reader.lines().filter_map(|line| line.ok()).collect())
| ^^^^^^^^^^^^^^
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#lines_filter_map_ok
= note: `#[warn(clippy::lines_filter_map_ok)]` on by default
warning: `lr_grustep` (lib) generated 2 warnings (run `cargo clippy --fix --lib -p lr_grustep` to apply 1 suggestion)
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
Try to fix all of them and run clippy
again.
cargo clippy
If nothing pops out, your code is in "good style" now.
Changes in src/lib.rs:
@@ -58,7 +58,7 @@ pub fn grep_recursive(
let entry = entry?;
if entry.file_type().is_file() {
let file_path = entry.path();
- let result = grep(pattern, &file_path, options)?;
+ let result = grep(pattern, file_path, options)?;
results.extend(result);
}
}
@@ -68,7 +68,7 @@ pub fn grep_recursive(
fn read_file_lines(file_path: &Path) -> Result<Vec<String>, io::Error> {
let file = fs::File::open(file_path)?;
let reader = io::BufReader::new(file);
- Ok(reader.lines().filter_map(|line| line.ok()).collect())
+ Ok(reader.lines().map_while(Result::ok).collect())
}
fn filter_lines(pattern: &Regex, lines: &[String], flag: bool) -> Vec<MatchItem> {