use std::io::Write;
use std::sync::OnceLock;
use std::time::{SystemTime, UNIX_EPOCH};
use bytesbuf::BytesView;
use bytesbuf::mem::{HasMemory, Memory, MemoryShared};
const HEADER_PREFIX: &[u8] = b"Unix-Milliseconds: ";
const TWO_NEWLINES: &[u8] = b"\r\n\r\n";
fn main() {
let header_prefix = OnceLock::<BytesView>::new();
let two_newlines = OnceLock::<BytesView>::new();
for _ in 0..10 {
let mut connection = Connection::accept();
let header_prefix = header_prefix.get_or_init(|| BytesView::copied_from_slice(HEADER_PREFIX, &connection.memory()));
let two_newlines = two_newlines.get_or_init(|| BytesView::copied_from_slice(TWO_NEWLINES, &connection.memory()));
let mut response_buf = connection.memory().reserve(TIMESTAMP_MAX_LEN);
response_buf.put_bytes(header_prefix.clone());
let mut stringification_buffer = [0u8; TIMESTAMP_MAX_LEN];
let timestamp_bytes = serialize_timestamp(&mut stringification_buffer);
response_buf.put_slice(timestamp_bytes);
response_buf.put_bytes(two_newlines.clone());
connection.write(response_buf.consume_all());
}
}
const TIMESTAMP_MAX_LEN: usize = 39;
fn serialize_timestamp(buffer: &mut [u8; TIMESTAMP_MAX_LEN]) -> &[u8] {
let now = SystemTime::now();
let unix_millis = now
.duration_since(UNIX_EPOCH)
.expect("impossible for time to be before unix epoch")
.as_millis();
let mut cursor = buffer.as_mut_slice();
write!(cursor, "{unix_millis}").expect("buffer size is known good constant - u128 must fit");
let bytes_written = TIMESTAMP_MAX_LEN - cursor.len();
&buffer[..bytes_written]
}
#[derive(Debug)]
struct Connection;
impl Connection {
const fn accept() -> Self {
Self {}
}
#[expect(clippy::needless_pass_by_ref_mut, clippy::unused_self, reason = "for example realism")]
fn write(&mut self, mut message: BytesView) {
print!("Sent message: ");
while !message.is_empty() {
let slice = message.first_slice();
print!("{}", String::from_utf8_lossy(slice));
message.advance(slice.len());
}
println!();
}
}
impl HasMemory for Connection {
fn memory(&self) -> impl MemoryShared {
bytesbuf::mem::testing::TransparentMemory::new()
}
}