100% doc coverage

This commit is contained in:
G2-Games 2024-08-06 15:44:26 -05:00
parent 7f53109d6f
commit 0299dbeee3
2 changed files with 32 additions and 18 deletions

View file

@ -1,7 +1,7 @@
//! Structs and enums which are included in the header of SQP files. //! Structs and enums which are included in the header of SQP files.
use byteorder::{ReadBytesExt, WriteBytesExt, LE}; use byteorder::{ReadBytesExt, WriteBytesExt, LE};
use std::io::{Cursor, Read, Write}; use std::io::{self, Read, Write};
use crate::picture::Error; use crate::picture::Error;
@ -42,21 +42,26 @@ impl Default for Header {
} }
impl Header { impl Header {
pub fn to_bytes(&self) -> [u8; 19] { /// Write the header into a byte stream implementing [`Write`].
let mut buf = Cursor::new(Vec::new()); ///
/// Returns the number of bytes written.
buf.write_all(&self.magic).unwrap(); pub fn write_into<W: Write + WriteBytesExt>(&self, output: &mut W) -> Result<usize, io::Error> {
buf.write_u32::<LE>(self.width).unwrap(); let mut count = 0;
buf.write_u32::<LE>(self.height).unwrap(); output.write_all(&self.magic)?;
output.write_u32::<LE>(self.width)?;
output.write_u32::<LE>(self.height)?;
count += 16;
// Write compression info // Write compression info
buf.write_u8(self.compression_type.into()).unwrap(); output.write_u8(self.compression_type.into())?;
buf.write_u8(self.quality).unwrap(); output.write_u8(self.quality)?;
count += 2;
// Write color format // Write color format
buf.write_u8(self.color_format as u8).unwrap(); output.write_u8(self.color_format as u8)?;
count += 1;
buf.into_inner().try_into().unwrap() Ok(count)
} }
/// Length of the header in bytes. /// Length of the header in bytes.
@ -65,13 +70,14 @@ impl Header {
19 19
} }
/// Create a header from something implementing [`Read`]. /// Create a header from a byte stream implementing [`Read`].
pub fn read_from<T: Read + ReadBytesExt>(input: &mut T) -> Result<Self, Error> { pub fn read_from<R: Read + ReadBytesExt>(input: &mut R) -> Result<Self, Error> {
let mut magic = [0u8; 8]; let mut magic = [0u8; 8];
input.read_exact(&mut magic).unwrap(); input.read_exact(&mut magic).unwrap();
if magic != *b"dangoimg" { if magic != *b"dangoimg" {
return Err(Error::InvalidIdentifier(magic)); let bad_id = String::from_utf8_lossy(&magic).into_owned();
return Err(Error::InvalidIdentifier(bad_id));
} }
Ok(Header { Ok(Header {

View file

@ -13,14 +13,18 @@ use crate::{
operations::{add_rows, sub_rows}, operations::{add_rows, sub_rows},
}; };
/// An error which occured while manipulating a [`SquishyPicture`].
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
#[error("incorrect identifier, got {0:02X?}")] /// The file signature was invalid. Must be "dangoimg".
InvalidIdentifier([u8; 8]), #[error("incorrect signature, expected \"dangoimg\" got {0:?}")]
InvalidIdentifier(String),
/// Any I/O operation failed.
#[error("io operation failed: {0}")] #[error("io operation failed: {0}")]
IoError(#[from] io::Error), IoError(#[from] io::Error),
/// There was an error while compressing or decompressing.
#[error("compression operation failed: {0}")] #[error("compression operation failed: {0}")]
CompressionError(#[from] CompressionError), CompressionError(#[from] CompressionError),
} }
@ -146,8 +150,7 @@ impl SquishyPicture {
let mut count = 0; let mut count = 0;
// Write out the header // Write out the header
output.write_all(&self.header.to_bytes()).unwrap(); count += self.header.write_into(&mut output)?;
count += self.header.len();
// Based on the compression type, modify the data accordingly // Based on the compression type, modify the data accordingly
let modified_data = match self.header.compression_type { let modified_data = match self.header.compression_type {
@ -241,6 +244,7 @@ impl SquishyPicture {
} }
} }
/// Decode a stream encoded as varints.
fn decode_varint_stream(stream: &[u8]) -> Vec<i16> { fn decode_varint_stream(stream: &[u8]) -> Vec<i16> {
let mut output = Vec::new(); let mut output = Vec::new();
let mut offset = 0; let mut offset = 0;
@ -253,6 +257,10 @@ fn decode_varint_stream(stream: &[u8]) -> Vec<i16> {
output output
} }
/// Open an SQP from a given path. Convenience method around
/// [`SquishyPicture::decode`]. Returns a [`Result<SquishyPicture>`].
///
/// If you are loading from memory, use [`SquishyPicture::decode`] instead.
pub fn open<P: AsRef<Path>>(path: P) -> Result<SquishyPicture, Error> { pub fn open<P: AsRef<Path>>(path: P) -> Result<SquishyPicture, Error> {
let input = File::open(path)?; let input = File::open(path)?;