use byteorder::{ReadBytesExt, WriteBytesExt};
use std::io;
use std::io::{Read, Write};
use base::JobStoppedReason;
use { PreliminaryTryFrom, WithFixedPayloadLength};
impl WithFixedPayloadLength for JobStoppedReason {
const FIXED_PAYLOAD_LENGTH: u16 = u8::FIXED_PAYLOAD_LENGTH;
}
impl PreliminaryTryFrom<u8> for JobStoppedReason {
type Error = io::Error;
fn try_from(value: u8) -> io::Result<Self> {
match value {
0 => Ok(JobStoppedReason::Finished),
1 => Ok(JobStoppedReason::StoppedByUser),
2 => Ok(JobStoppedReason::ExitCriterionMatched),
3 => Ok(JobStoppedReason::Failed),
_ => Err(io::Error::new(
io::ErrorKind::InvalidData,
format!("Invalid JobStoppedReason enum value {}", value),
)),
}
}
}
pub(crate) trait JobStoppedReasonWriterExt: Write {
fn write_job_stopped_reason(
&mut self,
r: &JobStoppedReason,
) -> io::Result<()> {
self.write_u8(r.clone() as u8)?;
Ok(())
}
}
impl<B: Write + ?Sized> JobStoppedReasonWriterExt for B {}
pub(crate) trait JobStoppedReasonReaderExt: Read {
fn read_job_stopped_reason(&mut self) -> io::Result<JobStoppedReason> {
let value = self.read_u8()?;
JobStoppedReason::try_from(value)
}
}
impl<B: Read + ?Sized> JobStoppedReasonReaderExt for B {}