sheave_core/writers/
extended_timestamp.rs

1use 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
30/// Writes an extended timestramp into streams.
31///
32/// # Examples
33///
34/// ```rust
35/// use std::{
36///     io::Result as IOResult,
37///     pin::{
38///         Pin,
39///         pin
40///     },
41///     time::Duration
42/// };
43/// use rand::random;
44/// use sheave_core::writers::write_extended_timestamp;
45///
46/// #[tokio::main]
47/// async fn main() -> IOResult<()> {
48///     let expected = Duration::from_millis(random::<u32>() as u64);
49///     let mut writer: Pin<&mut Vec<u8>> = pin!(Vec::new());
50///     write_extended_timestamp(writer.as_mut(), expected).await?;
51///     let mut written: [u8; 4] = [0; 4];
52///     written.copy_from_slice(&writer[..4]);
53///     let actual = Duration::from_millis(u32::from_be_bytes(written) as u64);
54///     assert_eq!(expected, actual);
55///     Ok(())
56/// }
57/// ```
58pub 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}