ort_openrouter_cli/common/
io.rs1extern crate alloc;
9use alloc::vec::Vec;
10
11use crate::{ErrorKind, OrtResult, ort_error};
12
13const MAX_LEN_UTF8: usize = 4;
14
15pub trait Read {
16 fn read(&mut self, buf: &mut [u8]) -> OrtResult<usize>;
17
18 fn read_exact(&mut self, mut buf: &mut [u8]) -> OrtResult<()> {
19 while !buf.is_empty() {
20 let n = self.read(buf)?;
21 if n == 0 {
22 break;
23 }
24 buf = &mut buf[n..];
25 }
26
27 if !buf.is_empty() {
28 Err(ort_error(ErrorKind::UnexpectedEof, ""))
29 } else {
30 Ok(())
31 }
32 }
33}
34
35pub trait Write {
36 fn write(&mut self, buf: &[u8]) -> OrtResult<usize>;
37 fn flush(&mut self) -> OrtResult<()>;
38
39 fn write_all(&mut self, mut buf: &[u8]) -> OrtResult<()> {
40 while !buf.is_empty() {
41 match self.write(buf) {
42 Ok(0) => {
43 return Err(ort_error(ErrorKind::UnexpectedEof, "EOF"));
44 }
45 Ok(n) => buf = &buf[n..],
46 Err(e) => return Err(e),
47 }
48 }
49
50 Ok(())
51 }
52
53 fn write_str(&mut self, s: &str) -> OrtResult<usize> {
54 self.write(s.as_bytes())
55 }
56
57 fn write_char(&mut self, c: char) -> OrtResult<usize> {
58 self.write_str(c.encode_utf8(&mut [0; MAX_LEN_UTF8]))
59 }
60
61 }
69
70impl Write for &mut Vec<u8> {
71 fn write(&mut self, buf: &[u8]) -> OrtResult<usize> {
72 self.extend(buf);
73 Ok(buf.len())
74 }
75
76 fn flush(&mut self) -> OrtResult<()> {
77 Ok(())
78 }
79}