#![allow(unused)] #![warn(clippy::seek_to_start_instead_of_rewind)] use std::fs::OpenOptions; use std::io::{Read, Seek, SeekFrom, Write}; struct StructWithSeekMethod {} impl StructWithSeekMethod { fn seek(&mut self, from: SeekFrom) {} } trait MySeekTrait { fn seek(&mut self, from: SeekFrom) {} } struct StructWithSeekTrait {} impl MySeekTrait for StructWithSeekTrait {} // This should NOT trigger clippy warning because // StructWithSeekMethod does not implement std::io::Seek; fn seek_to_start_false_method(t: &mut StructWithSeekMethod) { t.seek(SeekFrom::Start(0)); } // This should NOT trigger clippy warning because // StructWithSeekMethod does not implement std::io::Seek; fn seek_to_start_method_owned_false(mut t: StructWithSeekMethod) { t.seek(SeekFrom::Start(0)); } // This should NOT trigger clippy warning because // StructWithSeekMethod does not implement std::io::Seek; fn seek_to_start_false_trait(t: &mut StructWithSeekTrait) { t.seek(SeekFrom::Start(0)); } // This should NOT trigger clippy warning because // StructWithSeekMethod does not implement std::io::Seek; fn seek_to_start_false_trait_owned(mut t: StructWithSeekTrait) { t.seek(SeekFrom::Start(0)); } // This should NOT trigger clippy warning because // StructWithSeekMethod does not implement std::io::Seek; fn seek_to_start_false_trait_bound(t: &mut T) { t.seek(SeekFrom::Start(0)); } // This should trigger clippy warning fn seek_to_start(t: &mut T) { t.rewind(); } // This should trigger clippy warning fn owned_seek_to_start(mut t: T) { t.rewind(); } // This should NOT trigger clippy warning because // it does not seek to start fn seek_to_5(t: &mut T) { t.seek(SeekFrom::Start(5)); } // This should NOT trigger clippy warning because // it does not seek to start fn seek_to_end(t: &mut T) { t.seek(SeekFrom::End(0)); } // This should NOT trigger clippy warning because // expr is used here fn seek_to_start_in_let(t: &mut T) { let a = t.seek(SeekFrom::Start(0)).unwrap(); } fn main() { let mut f = OpenOptions::new() .write(true) .read(true) .create(true) .truncate(true) .open("foo.txt") .unwrap(); let mut my_struct_trait = StructWithSeekTrait {}; seek_to_start_false_trait_bound(&mut my_struct_trait); let hello = "Hello!\n"; write!(f, "{hello}").unwrap(); seek_to_5(&mut f); seek_to_end(&mut f); seek_to_start(&mut f); let mut buf = String::new(); f.read_to_string(&mut buf).unwrap(); assert_eq!(&buf, hello); } #[clippy::msrv = "1.54"] fn msrv_1_54() { let mut f = OpenOptions::new() .write(true) .read(true) .create(true) .truncate(true) .open("foo.txt") .unwrap(); let hello = "Hello!\n"; write!(f, "{hello}").unwrap(); f.seek(SeekFrom::Start(0)); let mut buf = String::new(); f.read_to_string(&mut buf).unwrap(); assert_eq!(&buf, hello); } #[clippy::msrv = "1.55"] fn msrv_1_55() { let mut f = OpenOptions::new() .write(true) .read(true) .create(true) .truncate(true) .open("foo.txt") .unwrap(); let hello = "Hello!\n"; write!(f, "{hello}").unwrap(); f.rewind(); let mut buf = String::new(); f.read_to_string(&mut buf).unwrap(); assert_eq!(&buf, hello); }