tauri_utils/
io.rs

1// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
2// SPDX-License-Identifier: Apache-2.0
3// SPDX-License-Identifier: MIT
4
5//! IO helpers.
6
7use std::io::BufRead;
8
9/// Read all bytes until a newline (the `0xA` byte) or a carriage return (`\r`) is reached, and append them to the provided buffer.
10///
11/// Adapted from <https://doc.rust-lang.org/std/io/trait.BufRead.html#method.read_line>.
12pub fn read_line<R: BufRead + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> std::io::Result<usize> {
13  let mut read = 0;
14  loop {
15    let (done, used) = {
16      let available = match r.fill_buf() {
17        Ok(n) => n,
18        Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => continue,
19
20        Err(e) => return Err(e),
21      };
22      match memchr::memchr(b'\n', available) {
23        Some(i) => {
24          let end = i + 1;
25          buf.extend_from_slice(&available[..end]);
26          (true, end)
27        }
28        None => match memchr::memchr(b'\r', available) {
29          Some(i) => {
30            let end = i + 1;
31            buf.extend_from_slice(&available[..end]);
32            (true, end)
33          }
34          None => {
35            buf.extend_from_slice(available);
36            (false, available.len())
37          }
38        },
39      }
40    };
41    r.consume(used);
42    read += used;
43    if done || used == 0 {
44      return Ok(read);
45    }
46  }
47}