From 4b18cbfe92d7912950be6b19556e217c76063eef Mon Sep 17 00:00:00 2001 From: KAMADA Ken'ichi Date: Wed, 12 Aug 2020 23:35:00 +0900 Subject: [PATCH] Move discard_exact into BufReadExt trait. --- src/png.rs | 4 ++-- src/util.rs | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/png.rs b/src/png.rs index 5980060..2657eb4 100644 --- a/src/png.rs +++ b/src/png.rs @@ -29,7 +29,7 @@ use std::io::Read; use crate::endian::{Endian, BigEndian}; use crate::error::Error; -use crate::util::discard_exact; +use crate::util::BufReadExt; // PNG file signature [PNG12 12.12]. const PNG_SIG: [u8; 8] = *b"\x89PNG\x0d\x0a\x1a\x0a"; @@ -77,7 +77,7 @@ fn get_exif_attr_sub(reader: &mut R) return Ok(data); } // Chunk data and CRC. - discard_exact(reader, len + 4)?; + reader.discard_exact(len + 4)?; } } diff --git a/src/util.rs b/src/util.rs index 0b042d8..f9f18e0 100644 --- a/src/util.rs +++ b/src/util.rs @@ -48,14 +48,19 @@ pub fn read64(reader: &mut R) -> Result where R: io::Read { Ok(u64::from_be_bytes(buf)) } -pub fn discard_exact(reader: &mut R, mut len: usize) - -> Result<(), io::Error> where R: io::BufRead { - while len > 0 { - let consume_len = reader.fill_buf()?.len().min(len); - reader.consume(consume_len); - len -= consume_len; +pub trait BufReadExt { + fn discard_exact(&mut self, len: usize) -> io::Result<()>; +} + +impl BufReadExt for T where T: io::BufRead { + fn discard_exact(&mut self, mut len: usize) -> io::Result<()> { + while len > 0 { + let consume_len = self.fill_buf()?.len().min(len); + self.consume(consume_len); + len -= consume_len; + } + Ok(()) } - Ok(()) } // This function must not be called with more than 4 bytes.