Skip to main content

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
8extern 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    /* Not used yet
62    fn write_byte(&mut self, b: u8) -> OrtResult<()> {
63        // TODO Override this in File, and other places where we can be more efficient
64        self.write(&vec![b])?;
65        Ok(())
66    }
67    */
68}
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}