#![allow(clippy::result_large_err)]
use bytes::{BufMut, Bytes, BytesMut};
use num_traits::FromPrimitive;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::model::{IppVersion, StatusCode};
pub mod attribute;
#[cfg(any(feature = "client", feature = "async-client"))]
pub mod client;
pub mod error;
pub mod model;
pub mod operation;
pub mod parser;
pub mod payload;
pub mod reader;
pub mod request;
pub mod util;
pub mod value;
pub mod prelude {
pub use http::Uri;
pub use num_traits::FromPrimitive as _;
pub use crate::{
attribute::{IppAttribute, IppAttributeGroup, IppAttributes},
model::*,
operation::builder::IppOperationBuilder,
payload::IppPayload,
request::IppRequestResponse,
value::IppValue,
};
pub use super::error::IppError;
#[cfg(feature = "async-client")]
pub use super::client::non_blocking::AsyncIppClient;
#[cfg(feature = "client")]
pub use super::client::blocking::IppClient;
pub use super::IppHeader;
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct IppHeader {
pub version: IppVersion,
pub operation_or_status: u16,
pub request_id: u32,
}
impl IppHeader {
pub fn new(version: IppVersion, operation_or_status: u16, request_id: u32) -> IppHeader {
IppHeader {
version,
operation_or_status,
request_id,
}
}
pub fn to_bytes(&self) -> Bytes {
let mut buffer = BytesMut::new();
buffer.put_u16(self.version.0);
buffer.put_u16(self.operation_or_status);
buffer.put_u32(self.request_id);
buffer.freeze()
}
pub fn status_code(&self) -> StatusCode {
StatusCode::from_u16(self.operation_or_status).unwrap_or(StatusCode::UnknownStatusCode)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_header_to_bytes() {
let header = IppHeader::new(IppVersion::v2_1(), 0x1234, 0xaa55_aa55);
let buf = header.to_bytes();
assert_eq!(buf, vec![0x02, 0x01, 0x12, 0x34, 0xaa, 0x55, 0xaa, 0x55]);
}
}