ALPHA: wire is a tool to deploy nixos systems
wire.althaea.zone/
1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright 2024-2025 wire Contributors
3
4/// Split into its own struct to be tested nicer
5pub(crate) struct LogBuffer {
6 buffer: Vec<u8>,
7}
8
9impl LogBuffer {
10 pub const fn new() -> Self {
11 Self { buffer: Vec::new() }
12 }
13
14 pub fn process_slice(&mut self, slice: &[u8]) {
15 self.buffer.extend_from_slice(slice);
16 }
17
18 pub fn next_line(&mut self) -> Option<Vec<u8>> {
19 let line_end = self.buffer.iter().position(|x| *x == b'\n')?;
20
21 let drained = self.buffer.drain(..line_end).collect();
22 self.buffer.remove(0);
23 Some(drained)
24 }
25
26 #[cfg(test)]
27 fn take_lines(&mut self) -> Vec<Vec<u8>> {
28 let mut lines = vec![];
29
30 while let Some(line) = self.next_line() {
31 lines.push(line);
32 }
33
34 lines
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_split_line_processing() {
44 let mut log_buffer = LogBuffer::new();
45
46 log_buffer.process_slice(b"Writing key KeySpec { destination: \"/et");
47 log_buffer.process_slice(b"c/keys/buildbot.aws.key\", user: \"buildbot\", group: \"buildbot-worker\", permissions: 384, length: 32, last: false, crc: 1370815231 }, 32 bytes of data");
48 log_buffer.process_slice(b"\n");
49 log_buffer.process_slice(b"xxx");
50 log_buffer.process_slice(b"xx_WIRE");
51 log_buffer.process_slice(b"_QUIT\n");
52 let lines = log_buffer.take_lines();
53 assert_eq!(lines.len(), 2);
54 assert_eq!(
55 String::from_utf8_lossy(lines.first().unwrap()),
56 "Writing key KeySpec { destination: \"/etc/keys/buildbot.aws.key\", user: \"buildbot\", group: \"buildbot-worker\", permissions: 384, length: 32, last: false, crc: 1370815231 }, 32 bytes of data"
57 );
58 assert_eq!(lines.get(1), Some(&"xxxxx_WIRE_QUIT".as_bytes().to_vec()));
59
60 // taking leaves none
61 assert_eq!(log_buffer.take_lines().len(), 0);
62 }
63}