ort_openrouter_cli/common/
io.rs1use core::fmt::Arguments;
9
10extern crate alloc;
11use alloc::string::ToString;
12use alloc::vec::Vec;
13
14use crate::{ErrorKind, OrtResult, ort_error, ort_from_err};
15
16const MAX_LEN_UTF8: usize = 4;
17
18pub trait Read {
19 fn read(&mut self, buf: &mut [u8]) -> OrtResult<usize>;
20
21 fn read_exact(&mut self, mut buf: &mut [u8]) -> OrtResult<()> {
22 while !buf.is_empty() {
23 match self.read(buf) {
24 Ok(0) => break,
25
26 Ok(n) => {
27 buf = &mut buf[n..];
28 }
29
30 Err(e) => {
31 return Err(ort_from_err(
32 ErrorKind::UnexpectedEof,
33 "read error during read_exact",
34 e,
35 ));
36 }
37 }
38 }
39
40 if !buf.is_empty() {
41 Err(ort_error(ErrorKind::UnexpectedEof, ""))
42 } else {
43 Ok(())
44 }
45 }
46}
47
48pub trait Write {
49 fn write(&mut self, buf: &[u8]) -> OrtResult<usize>;
50 fn flush(&mut self) -> OrtResult<()>;
51
52 fn write_all(&mut self, mut buf: &[u8]) -> OrtResult<()> {
53 while !buf.is_empty() {
54 match self.write(buf) {
55 Ok(0) => {
56 return Err(ort_error(ErrorKind::UnexpectedEof, "EOF"));
57 }
58 Ok(n) => buf = &buf[n..],
59 Err(e) => return Err(e),
60 }
61 }
62
63 Ok(())
64 }
65
66 fn write_fmt(&mut self, args: Arguments<'_>) -> OrtResult<()> {
67 self.write_all(args.to_string().as_bytes())
68 }
69
70 fn write_str(&mut self, s: &str) -> OrtResult<usize> {
71 self.write(s.as_bytes())
72 }
73
74 fn write_char(&mut self, c: char) -> OrtResult<usize> {
75 self.write_str(c.encode_utf8(&mut [0; MAX_LEN_UTF8]))
76 }
77
78 }
86
87impl Write for &mut Vec<u8> {
88 fn write(&mut self, buf: &[u8]) -> OrtResult<usize> {
89 self.extend(buf);
90 Ok(buf.len())
91 }
92
93 fn flush(&mut self) -> OrtResult<()> {
94 Ok(())
95 }
96}