sheave_core/writers/
extended_timestamp.rs1use std::{
2 future::Future,
3 io::Result as IOResult,
4 pin::Pin,
5 task::{
6 Context as FutureContext,
7 Poll
8 },
9 time::Duration
10};
11use tokio::io::AsyncWrite;
12
13#[doc(hidden)]
14#[derive(Debug)]
15pub struct ExtendedTimestampWriter<'a, W: AsyncWrite> {
16 writer: Pin<&'a mut W>,
17 extended_timestamp: Duration
18}
19
20#[doc(hidden)]
21impl<W: AsyncWrite> Future for ExtendedTimestampWriter<'_, W> {
22 type Output = IOResult<()>;
23
24 fn poll(mut self: Pin<&mut Self>, cx: &mut FutureContext<'_>) -> Poll<Self::Output> {
25 let extended_timestamp_bytes = (self.extended_timestamp.as_millis() as u32).to_be_bytes();
26 self.writer.as_mut().poll_write(cx, &extended_timestamp_bytes).map_ok(|_| ())
27 }
28}
29
30pub fn write_extended_timestamp<W: AsyncWrite>(writer: Pin<&mut W>, extended_timestamp: Duration) -> ExtendedTimestampWriter<'_, W> {
59 ExtendedTimestampWriter { writer, extended_timestamp }
60}
61
62#[cfg(test)]
63mod tests {
64 use std::pin::pin;
65 use rand::random;
66 use super::*;
67
68 #[tokio::test]
69 async fn write_extended_ts() {
70 let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
71 let expected = Duration::from_millis(random::<u32>() as u64);
72 let result = write_extended_timestamp(writer.as_mut(), expected).await;
73 assert!(result.is_ok());
74 let mut written: [u8; 4] = [0; 4];
75 written.copy_from_slice(&writer[..4]);
76 let actual = Duration::from_millis(u32::from_be_bytes(written) as u64);
77 assert_eq!(expected, actual)
78 }
79}