use crate::err::Result;
use std::fmt::{self, Display};
use std::io::{Cursor, Read};
use byteorder::{LittleEndian, ReadBytesExt};
use serde::ser;
#[derive(PartialOrd, PartialEq, Clone, Debug)]
pub struct Guid {
data1: u32,
data2: u16,
data3: u16,
data4: [u8; 8],
}
impl Guid {
pub fn new(data1: u32, data2: u16, data3: u16, data4: [u8; 8]) -> Guid {
Guid {
data1,
data2,
data3,
data4,
}
}
pub fn from_buffer(buffer: &[u8]) -> Result<Guid> {
Self::from_reader(&mut Cursor::new(buffer))
}
#[deprecated = "use `from_reader`"]
pub fn from_stream<T: Read>(stream: &mut T) -> Result<Guid> {
Self::from_reader(stream)
}
pub fn from_reader<T: Read>(stream: &mut T) -> Result<Guid> {
let data1 = stream.read_u32::<LittleEndian>()?;
let data2 = stream.read_u16::<LittleEndian>()?;
let data3 = stream.read_u16::<LittleEndian>()?;
let mut data4 = [0; 8];
stream.read_exact(&mut data4)?;
Ok(Guid::new(data1, data2, data3, data4))
}
}
impl Display for Guid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{:08X}-{:04X}-{:04X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}",
self.data1,
self.data2,
self.data3,
self.data4[0],
self.data4[1],
self.data4[2],
self.data4[3],
self.data4[4],
self.data4[5],
self.data4[6],
self.data4[7]
)
}
}
impl ser::Serialize for Guid {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}