use std::{fs, path::Path, str::FromStr};
use crate::{errors::Result, Chunk, ChunkType, Error, Png};
pub fn encode<T: AsRef<Path>>(
input_file: T,
output_file: T,
chunk_type: String,
bytes_to_hide: &[u8],
) -> Result<()> {
let file_bytes = fs::read(input_file)?;
let mut png = Png::try_from(file_bytes.as_slice())?;
let chunk_type = ChunkType::from_str(&chunk_type)?;
let new_chunk = Chunk::new(chunk_type, bytes_to_hide.to_vec());
png.append_chunk(new_chunk);
fs::write(output_file, png.as_bytes())?;
Ok(())
}
pub fn decode<T: AsRef<Path>>(file: T, chunk_type: String) -> Result<Vec<u8>> {
let file_bytes = fs::read(file)?;
let png = Png::try_from(file_bytes.as_slice())?;
let chunk = match png.chunk_by_type(&chunk_type) {
Some(chunk) => chunk,
None => {
return Err(Error::from("No chunk found for specified chunk type"));
}
};
let hidden_bytes = chunk.data().to_vec();
Ok(hidden_bytes)
}
pub fn remove<T: AsRef<Path>>(file: T, chunk_type: String) -> Result<()> {
let file_bytes = fs::read(file)?;
let mut png = Png::try_from(file_bytes.as_slice())?;
let _chunk = png.remove_first_chunk(chunk_type.as_str())?;
fs::write("img/removed_chunk.png", png.as_bytes())?;
Ok(())
}
pub fn print_chunks<T: AsRef<Path>>(file: T) -> Result<()> {
let file_bytes = fs::read(file)?;
let png = Png::try_from(file_bytes.as_slice())?;
println!("PNG file content : {png}");
Ok(())
}