use crate::header::{FSMetaV1, FSPrefix};
use anyhow::bail;
use std::io::{Read, Write};
use tracing::*;
pub fn write_jobfile_header<W: Write>(meta: FSMetaV1, writer: &mut W) -> Result<(), anyhow::Error> {
let fsp = FSPrefix::from(meta);
fsp.write(writer)?;
Ok(())
}
pub fn write_jobfile_header_payload<R: Read + ?Sized, W: Write>(
meta: FSMetaV1,
reader: &mut R,
writer: &mut W,
) -> Result<u64, anyhow::Error> {
write_jobfile_header(meta, writer)?;
Ok(std::io::copy(reader, writer)?)
}
pub fn read_jobfile_header<R: Read + ?Sized>(input: &mut R) -> Result<FSMetaV1, anyhow::Error> {
let fsp = match FSPrefix::read(input) {
Ok(f) => f,
Err(e) => {
debug!("Error reading FSPrefix: {}", e);
bail!(e);
}
};
trace!(
"Loaded header version {}, seq {}",
fsp.version,
fsp.meta.seq
);
Ok(fsp.into())
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Read;
#[test]
fn basic() {
let meta = FSMetaV1::default();
let mut file = Vec::new();
write_jobfile_header(meta.clone(), &mut file).unwrap();
let mut reader = file.as_slice();
let newone = read_jobfile_header(&mut reader).unwrap();
assert_eq!(meta, newone);
let mut buf = [0u8; 5];
assert_eq!(reader.read(&mut buf).unwrap(), 0);
}
#[test]
fn payload() {
let payload = b"This is a test payload";
let mut reader = &payload[0..];
let meta = FSMetaV1::default();
let mut file = Vec::new();
write_jobfile_header_payload(meta.clone(), &mut reader, &mut file).unwrap();
let mut reader = file.as_slice();
let newone = read_jobfile_header(&mut reader).unwrap();
assert_eq!(meta, newone);
let mut buf = Vec::new();
std::io::copy(&mut reader, &mut buf).unwrap();
assert_eq!(payload, buf.as_slice());
}
}