You've already forked comprehensive-rust
mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-12-18 05:37:12 +02:00
Introduce a cargo clippy run (#2025)
This might help catch stylistic problems in our Rust code. Related to #2587.
This commit is contained in:
32
.github/workflows/build.yml
vendored
32
.github/workflows/build.yml
vendored
@@ -11,38 +11,6 @@ env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
format:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
NIGHTLY_VERSION: nightly-2025-09-01
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install formatting dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install gettext yapf3
|
||||
|
||||
- name: Install pinned nightly for rustfmt
|
||||
run: |
|
||||
rustup toolchain install --profile minimal "$NIGHTLY_VERSION"
|
||||
rustup component add rustfmt --toolchain "$NIGHTLY_VERSION"
|
||||
|
||||
- name: Check formatting
|
||||
uses: dprint/check@v2.3
|
||||
|
||||
typos:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Check for typos
|
||||
uses: crate-ci/typos@v1.35.7
|
||||
with:
|
||||
config: ./.github/typos.toml
|
||||
|
||||
cargo:
|
||||
strategy:
|
||||
matrix:
|
||||
|
||||
55
.github/workflows/lint.yml
vendored
Normal file
55
.github/workflows/lint.yml
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
clippy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Rust cache
|
||||
uses: ./.github/workflows/setup-rust-cache
|
||||
|
||||
- name: Clippy
|
||||
run: cargo clippy -- -Dwarnings
|
||||
|
||||
format:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
NIGHTLY_VERSION: nightly-2025-09-01
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install formatting dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install gettext yapf3
|
||||
|
||||
- name: Install pinned nightly for rustfmt
|
||||
run: |
|
||||
rustup toolchain install --profile minimal "$NIGHTLY_VERSION"
|
||||
rustup component add rustfmt --toolchain "$NIGHTLY_VERSION"
|
||||
|
||||
- name: Check formatting
|
||||
uses: dprint/check@v2.3
|
||||
|
||||
typos:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Check for typos
|
||||
uses: crate-ci/typos@v1.35.7
|
||||
with:
|
||||
config: ./.github/typos.toml
|
||||
@@ -48,7 +48,7 @@ fn timediff(actual: u64, target: u64, slop: u64) -> String {
|
||||
} else if actual + slop < target {
|
||||
format!("{}: ({} short)", duration(actual), duration(target - actual),)
|
||||
} else {
|
||||
format!("{}", duration(actual))
|
||||
duration(actual).to_string()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ fn main() {
|
||||
);
|
||||
let matches = app.get_matches();
|
||||
|
||||
if let Some(_) = matches.subcommand_matches("supports") {
|
||||
if matches.subcommand_matches("supports").is_some() {
|
||||
// Support all renderers.
|
||||
process::exit(0);
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ impl Courses {
|
||||
fn course_mut(&mut self, name: impl AsRef<str>) -> &mut Course {
|
||||
let name = name.as_ref();
|
||||
if let Some(found_idx) =
|
||||
self.courses.iter().position(|course| &course.name == name)
|
||||
self.courses.iter().position(|course| course.name == name)
|
||||
{
|
||||
return &mut self.courses[found_idx];
|
||||
}
|
||||
@@ -177,9 +177,7 @@ impl Courses {
|
||||
&self,
|
||||
chapter: &Chapter,
|
||||
) -> Option<(&Course, &Session, &Segment, &Slide)> {
|
||||
let Some(ref source_path) = chapter.source_path else {
|
||||
return None;
|
||||
};
|
||||
let source_path = chapter.source_path.as_ref()?;
|
||||
|
||||
for course in self {
|
||||
for session in course {
|
||||
@@ -193,7 +191,7 @@ impl Courses {
|
||||
}
|
||||
}
|
||||
|
||||
return None;
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,7 +200,7 @@ impl<'a> IntoIterator for &'a Courses {
|
||||
type IntoIter = std::slice::Iter<'a, Course>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
(&self.courses).into_iter()
|
||||
self.courses.iter()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +214,7 @@ impl Course {
|
||||
fn session_mut(&mut self, name: impl AsRef<str>) -> &mut Session {
|
||||
let name = name.as_ref();
|
||||
if let Some(found_idx) =
|
||||
self.sessions.iter().position(|session| &session.name == name)
|
||||
self.sessions.iter().position(|session| session.name == name)
|
||||
{
|
||||
return &mut self.sessions[found_idx];
|
||||
}
|
||||
@@ -275,7 +273,7 @@ impl<'a> IntoIterator for &'a Course {
|
||||
type IntoIter = std::slice::Iter<'a, Session>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
(&self.sessions).into_iter()
|
||||
self.sessions.iter()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -348,7 +346,7 @@ impl<'a> IntoIterator for &'a Session {
|
||||
type IntoIter = std::slice::Iter<'a, Segment>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
(&self.segments).into_iter()
|
||||
self.segments.iter()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -401,7 +399,7 @@ impl<'a> IntoIterator for &'a Segment {
|
||||
type IntoIter = std::slice::Iter<'a, Slide>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
(&self.slides).into_iter()
|
||||
self.slides.iter()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -449,7 +447,7 @@ impl Slide {
|
||||
pub fn is_sub_chapter(&self, chapter: &Chapter) -> bool {
|
||||
// The first `source_path` in the slide is the "parent" chapter, so anything
|
||||
// else is a sub-chapter.
|
||||
chapter.source_path.as_ref() != self.source_paths.get(0)
|
||||
chapter.source_path.as_ref() != self.source_paths.first()
|
||||
}
|
||||
|
||||
/// Return the total duration of this slide.
|
||||
|
||||
@@ -83,7 +83,7 @@ impl<const N: usize> Table<N> {
|
||||
for cell in iter {
|
||||
write!(f, " {} |", cell)?;
|
||||
}
|
||||
write!(f, "\n")
|
||||
writeln!(f)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ pub fn replace(
|
||||
["course", "outline", course_name @ ..] => {
|
||||
let course_name = course_name.join(" ");
|
||||
let Some(course) = courses.find_course(course_name) else {
|
||||
return format!("not found - {}", captures[0].to_string());
|
||||
return format!("not found - {}", &captures[0]);
|
||||
};
|
||||
course.schedule()
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ async fn main() -> Result<(), tokio_websockets::Error> {
|
||||
println!("From server: {}", text);
|
||||
}
|
||||
},
|
||||
Some(Err(err)) => return Err(err.into()),
|
||||
Some(Err(err)) => return Err(err),
|
||||
None => return Ok(()),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ fn unpack_tag(tag: u64) -> (u64, WireType) {
|
||||
|
||||
// ANCHOR: parse_field
|
||||
/// Parse a field, returning the remaining bytes
|
||||
fn parse_field(data: &[u8]) -> (Field, &[u8]) {
|
||||
fn parse_field(data: &[u8]) -> (Field<'_>, &[u8]) {
|
||||
let (tag, remainder) = parse_varint(data);
|
||||
let (field_num, wire_type) = unpack_tag(tag);
|
||||
let (fieldvalue, remainder) = match wire_type {
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Iterators are covered later.
|
||||
#[allow(clippy::needless_range_loop)]
|
||||
// ANCHOR: solution
|
||||
// ANCHOR: transpose
|
||||
fn transpose(matrix: [[i32; 3]; 3]) -> [[i32; 3]; 3] {
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Omitting `return` is covered later.
|
||||
#[allow(clippy::needless_return)]
|
||||
// ANCHOR: solution
|
||||
// ANCHOR: fib
|
||||
fn fib(n: u32) -> u32 {
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// `DIR` matches name of C struct.
|
||||
#[allow(clippy::upper_case_acronyms)]
|
||||
// ANCHOR: solution
|
||||
// ANCHOR: ffi
|
||||
mod ffi {
|
||||
@@ -40,7 +42,7 @@ mod ffi {
|
||||
}
|
||||
|
||||
// Layout according to the macOS man page for dir(5).
|
||||
#[cfg(all(target_os = "macos"))]
|
||||
#[cfg(target_os = "macos")]
|
||||
#[repr(C)]
|
||||
pub struct dirent {
|
||||
pub d_fileno: u64,
|
||||
|
||||
@@ -29,7 +29,7 @@ impl User {
|
||||
// ANCHOR_END: setup
|
||||
|
||||
// ANCHOR: User_visit_doctor
|
||||
pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
|
||||
pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport<'_> {
|
||||
// ANCHOR_END: User_visit_doctor
|
||||
self.visit_count += 1;
|
||||
let bp = measurements.blood_pressure;
|
||||
@@ -37,12 +37,9 @@ impl User {
|
||||
patient_name: &self.name,
|
||||
visit_count: self.visit_count,
|
||||
height_change: measurements.height - self.height,
|
||||
blood_pressure_change: match self.last_blood_pressure {
|
||||
Some(lbp) => {
|
||||
Some((bp.0 as i32 - lbp.0 as i32, bp.1 as i32 - lbp.1 as i32))
|
||||
}
|
||||
None => None,
|
||||
},
|
||||
blood_pressure_change: self
|
||||
.last_blood_pressure
|
||||
.map(|lbp| (bp.0 as i32 - lbp.0 as i32, bp.1 as i32 - lbp.1 as i32)),
|
||||
};
|
||||
self.height = measurements.height;
|
||||
self.last_blood_pressure = Some(bp);
|
||||
|
||||
Reference in New Issue
Block a user