ort_openrouter_cli/common/
io.rs

1//! ort: Open Router CLI
2//! https://github.com/grahamking/ort
3//!
4//! MIT License
5//! Copyright (c) 2025 Graham King
6//!
7
8use 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    /* Not used yet
79    fn write_byte(&mut self, b: u8) -> OrtResult<()> {
80        // TODO Override this in File, and other places where we can be more efficient
81        self.write(&vec![b])?;
82        Ok(())
83    }
84    */
85}
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}