drivers/standard_library/
console.rs1use 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}