drivers/standard_library/
console.rs

1use std::io::{Read, Write, stderr, stdin, stdout};
2
3use file_system::{DeviceTrait, Size};
4
5use crate::standard_library::io::map_error;
6
7pub struct StandardInDevice;
8
9impl DeviceTrait for StandardInDevice {
10    fn read(&self, buffer: &mut [u8]) -> file_system::Result<Size> {
11        #[allow(clippy::unused_io_amount)]
12        stdin().read(buffer).unwrap();
13
14        Ok(Size::new(buffer.len() as u64))
15    }
16
17    fn write(&self, _: &[u8]) -> file_system::Result<Size> {
18        Err(file_system::Error::UnsupportedOperation)
19    }
20
21    fn get_size(&self) -> file_system::Result<Size> {
22        Ok(Size::new(0))
23    }
24
25    fn set_position(&self, _: &file_system::Position) -> file_system::Result<Size> {
26        Err(file_system::Error::UnsupportedOperation)
27    }
28
29    fn flush(&self) -> file_system::Result<()> {
30        Ok(())
31    }
32
33    fn is_a_terminal(&self) -> bool {
34        true
35    }
36}
37
38pub struct StandardOutDevice;
39
40impl DeviceTrait for StandardOutDevice {
41    fn read(&self, _: &mut [u8]) -> file_system::Result<Size> {
42        Err(file_system::Error::UnsupportedOperation)
43    }
44
45    fn write(&self, buffer: &[u8]) -> file_system::Result<Size> {
46        Ok(Size::new(stdout().write(buffer).map_err(map_error)? as u64))
47    }
48
49    fn get_size(&self) -> file_system::Result<Size> {
50        Ok(Size::new(0))
51    }
52
53    fn set_position(&self, _: &file_system::Position) -> file_system::Result<Size> {
54        Err(file_system::Error::UnsupportedOperation)
55    }
56
57    fn flush(&self) -> file_system::Result<()> {
58        stdout().flush().map_err(map_error)
59    }
60
61    fn is_a_terminal(&self) -> bool {
62        true
63    }
64}
65
66pub struct StandardErrorDevice;
67
68impl DeviceTrait for StandardErrorDevice {
69    fn read(&self, _: &mut [u8]) -> file_system::Result<Size> {
70        Err(file_system::Error::UnsupportedOperation)
71    }
72
73    fn write(&self, buffer: &[u8]) -> file_system::Result<Size> {
74        Ok(Size::new(stderr().write(buffer).map_err(map_error)? as u64))
75    }
76
77    fn get_size(&self) -> file_system::Result<Size> {
78        Ok(Size::new(0))
79    }
80
81    fn set_position(&self, _: &file_system::Position) -> file_system::Result<Size> {
82        Err(file_system::Error::UnsupportedOperation)
83    }
84
85    fn flush(&self) -> file_system::Result<()> {
86        stderr().flush().map_err(map_error)
87    }
88
89    fn is_a_terminal(&self) -> bool {
90        true
91    }
92}