diff --git a/.github/workflows/sanity_checks.yml b/.github/workflows/sanity_checks.yml new file mode 100644 index 000000000..4965e7d06 --- /dev/null +++ b/.github/workflows/sanity_checks.yml @@ -0,0 +1,26 @@ +name: Sanity Checks + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + components: rustfmt, clippy + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run Clippy + run: cargo clippy -- -Dwarnings + + - name: Run tests + run: cargo test diff --git a/examples/count.rs b/examples/count.rs index ad666a114..b3a025ebe 100644 --- a/examples/count.rs +++ b/examples/count.rs @@ -11,7 +11,7 @@ extern crate env_logger; extern crate osmpbfreader; fn count bool>(filter: F, filename: &std::ffi::OsStr) { - let r = std::fs::File::open(&std::path::Path::new(filename)).unwrap(); + let r = std::fs::File::open(std::path::Path::new(filename)).unwrap(); let mut pbf = osmpbfreader::OsmPbfReader::new(r); let mut nb_nodes = 0; let mut sum_lon = 0.; diff --git a/examples/count_with_deps.rs b/examples/count_with_deps.rs index da39a6650..93bf26d87 100644 --- a/examples/count_with_deps.rs +++ b/examples/count_with_deps.rs @@ -11,7 +11,7 @@ extern crate env_logger; extern crate osmpbfreader; fn count bool>(filter: F, filename: &std::ffi::OsStr) { - let r = std::fs::File::open(&std::path::Path::new(filename)).unwrap(); + let r = std::fs::File::open(std::path::Path::new(filename)).unwrap(); let mut pbf = osmpbfreader::OsmPbfReader::new(r); let objs = pbf.get_objs_and_deps(|obj| filter(obj.tags())).unwrap(); let mut nb_nodes = 0; diff --git a/examples/relation.rs b/examples/relation.rs index 3ab6329bf..ff772cc69 100644 --- a/examples/relation.rs +++ b/examples/relation.rs @@ -14,7 +14,7 @@ fn wanted(obj: &osmpbfreader::OsmObj) -> bool { fn main() { let filename = std::env::args_os().nth(1).unwrap(); let path = std::path::Path::new(&filename); - let r = std::fs::File::open(&path).unwrap(); + let r = std::fs::File::open(path).unwrap(); let mut pbf = osmpbfreader::OsmPbfReader::new(r); let objects = pbf.get_objs_and_deps(wanted).unwrap(); println!( diff --git a/examples/tutorial.rs b/examples/tutorial.rs index 80f3300bf..ab409492e 100644 --- a/examples/tutorial.rs +++ b/examples/tutorial.rs @@ -10,7 +10,7 @@ extern crate osmpbfreader; fn main() { let filename = std::env::args_os().nth(1).unwrap(); let path = std::path::Path::new(&filename); - let r = std::fs::File::open(&path).unwrap(); + let r = std::fs::File::open(path).unwrap(); let mut pbf = osmpbfreader::OsmPbfReader::new(r); let mut nb = 0; for _obj in pbf.iter().map(Result::unwrap) { diff --git a/src/blobs.rs b/src/blobs.rs index 0d958efb7..5d6e7fa83 100644 --- a/src/blobs.rs +++ b/src/blobs.rs @@ -9,31 +9,33 @@ use std::iter; -use crate::blocks::{self, OsmObjs as OsmBlockObjs, Relations as BlockRelations, Ways as BlockWays, Nodes as BlockNodes}; +use crate::blocks::{ + self, Nodes as BlockNodes, OsmObjs as OsmBlockObjs, Relations as BlockRelations, + Ways as BlockWays, +}; use crate::fileformat::Blob; use crate::objects::OsmObj; use crate::osmformat::PrimitiveBlock; macro_rules! wrap { ($name: ident, $wrap_type: ident => $inner_type: path) => { -self_cell::self_cell!( - #[allow(missing_docs)] - pub struct $name { - owner: PrimitiveBlock, - - #[covariant] - dependent: $wrap_type, - } -); - -impl Iterator for $name { - type Item = $inner_type; - - fn next(&mut self) -> Option { - self.with_dependent_mut(|_, objs| objs.next()) - } -} - + self_cell::self_cell!( + #[allow(missing_docs)] + pub struct $name { + owner: PrimitiveBlock, + + #[covariant] + dependent: $wrap_type, + } + ); + + impl Iterator for $name { + type Item = $inner_type; + + fn next(&mut self) -> Option { + self.with_dependent_mut(|_, objs| objs.next()) + } + } }; } @@ -45,6 +47,7 @@ wrap!(OsmBlobNodes, BlockNodes => super::Node); /// An iterator on `Result`. pub struct OsmObjs(OsmObjsImpl); +#[allow(clippy::type_complexity)] enum OsmObjsImpl { OkIter(iter::Map::Item) -> crate::Result<::Item>>), ErrIter(iter::Once::Item>>), @@ -63,7 +66,9 @@ impl Iterator for OsmObjs { /// Transforms a `Result` into a `Iterator>`. pub fn result_blob_into_iter(result: crate::Result) -> OsmObjs { match result.and_then(|b| crate::reader::primitive_block_from_blob(&b)) { - Ok(block) => OsmObjs(OsmObjsImpl::OkIter(OsmBlobObjs::new(block, blocks::iter).map(Ok))), + Ok(block) => OsmObjs(OsmObjsImpl::OkIter( + OsmBlobObjs::new(block, blocks::iter).map(Ok), + )), Err(e) => OsmObjs(OsmObjsImpl::ErrIter(iter::once(Err(e)))), } } @@ -71,7 +76,9 @@ pub fn result_blob_into_iter(result: crate::Result) -> OsmObjs` into a `Iterator>`. pub fn result_blob_into_node_iter(result: crate::Result) -> OsmObjs { match result.and_then(|b| crate::reader::primitive_block_from_blob(&b)) { - Ok(block) => OsmObjs(OsmObjsImpl::OkIter(OsmBlobNodes::new(block, blocks::nodes).map(Ok))), + Ok(block) => OsmObjs(OsmObjsImpl::OkIter( + OsmBlobNodes::new(block, blocks::nodes).map(Ok), + )), Err(e) => OsmObjs(OsmObjsImpl::ErrIter(iter::once(Err(e)))), } } @@ -79,7 +86,9 @@ pub fn result_blob_into_node_iter(result: crate::Result) -> OsmObjs` into a `Iterator>`. pub fn result_blob_into_way_iter(result: crate::Result) -> OsmObjs { match result.and_then(|b| crate::reader::primitive_block_from_blob(&b)) { - Ok(block) => OsmObjs(OsmObjsImpl::OkIter(OsmBlobWays::new(block, blocks::ways).map(Ok))), + Ok(block) => OsmObjs(OsmObjsImpl::OkIter( + OsmBlobWays::new(block, blocks::ways).map(Ok), + )), Err(e) => OsmObjs(OsmObjsImpl::ErrIter(iter::once(Err(e)))), } } @@ -87,7 +96,9 @@ pub fn result_blob_into_way_iter(result: crate::Result) -> OsmObjs` into a `Iterator>`. pub fn result_blob_into_relation_iter(result: crate::Result) -> OsmObjs { match result.and_then(|b| crate::reader::primitive_block_from_blob(&b)) { - Ok(block) => OsmObjs(OsmObjsImpl::OkIter(OsmBlobRelations::new(block, blocks::relations).map(Ok))), + Ok(block) => OsmObjs(OsmObjsImpl::OkIter( + OsmBlobRelations::new(block, blocks::relations).map(Ok), + )), Err(e) => OsmObjs(OsmObjsImpl::ErrIter(iter::once(Err(e)))), } } diff --git a/src/objects.rs b/src/objects.rs index 4e9046099..80f3bde5f 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -29,7 +29,7 @@ impl Tags { /// Returns if it contains a tag with the given `key` and `value`. pub fn contains(&self, key: &str, value: &str) -> bool { - self.0.get(key).map_or(false, |v| v.as_str() == value) + self.0.get(key).is_some_and(|v| v.as_str() == value) } /// Consume tags into inner FlatMap representation diff --git a/src/reader.rs b/src/reader.rs index c618e54a3..93cba57a2 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -127,11 +127,12 @@ impl OsmPbfReader { /// CPU usage are guaranteed to be bounded even if the caller stop /// consuming items. pub fn par_iter_relations(&mut self) -> RelationParIter<'_, R> { - RelationParIter(self.blobs().par_flat_map(blobs::result_blob_into_relation_iter)) + RelationParIter( + self.blobs() + .par_flat_map(blobs::result_blob_into_relation_iter), + ) } - - /// Rewinds the pbf file to the begining. /// /// Useful if you want to read several consecutive times the same @@ -367,7 +368,6 @@ pub_iterator_type! { where R: io::Read + 'a } - pub_iterator_type! { #[doc="Iterator on the `OsmObj` of the pbf file."] RelationIter['a, R] = iter::FlatMap, blobs::OsmObjs, fn(Result) -> blobs::OsmObjs>