1#[cxx::bridge(namespace = "terminal")]
2mod ffi {
3 unsafe extern "C++" {
16 include!("imgui-terminal-rs.h");
20
21 type Terminal;
24
25 fn new_terminal() -> UniquePtr<Terminal>;
27 fn reset(self: Pin<&mut Terminal>);
28 fn draw_term(terminal: Pin<&mut Terminal>, str_id: String, p_open: &mut bool);
29 fn write_term(terminal: Pin<&mut Terminal>, bytes: &str);
30 fn read_term(terminal: Pin<&mut Terminal>, bytes: &mut [u8]) -> i32;
31 }
32}
33
34pub struct Terminal {
35 inner: cxx::UniquePtr<ffi::Terminal>,
36}
37impl Terminal {
38 pub fn new() -> Option<Self> {
39 let inner = ffi::new_terminal();
40 if inner.is_null() {
41 return None;
42 }
43 Some(Self { inner: ffi::new_terminal() })
44 }
45 pub fn as_inner(&mut self) -> std::pin::Pin<&mut ffi::Terminal> {
46 self.inner.pin_mut()
47 }
48 pub fn reset(&mut self) {
50 self.as_inner().reset()
51 }
52 pub fn draw(&mut self, str_id: &imgui::ImStr, open: &mut bool) {
56 ffi::draw_term(self.as_inner(), str_id.to_string(), &mut *open)
57 }
58 pub fn write(&mut self, bytes: &str) {
61 ffi::write_term(self.as_inner(), bytes)
62 }
63
64 pub fn read(&mut self, buffer: &mut [u8]) -> i32 {
65 ffi::read_term(self.as_inner(), buffer)
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 #[test]
72 fn it_works() {
73 assert_eq!(2 + 2, 4);
74 }
75}