1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
use byteorder::{ReadBytesExt, WriteBytesExt}; use std::io; use std::io::{Read, Write}; use {PreliminaryTryFrom, WithFixedPayloadLength}; #[repr(u8)] #[derive(Clone, Debug, PartialEq)] pub enum JobStoppedReason { Finished = 0, StoppedByUser = 1, ExitCriterionMatched = 2, Failed = 3, } 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 {}