Skip to main content

turtle_build/infrastructure/console/
os.rs

1use crate::infrastructure::Console;
2use async_trait::async_trait;
3use core::error::Error;
4use tokio::io::{AsyncWriteExt, Stderr, Stdout, stderr, stdout};
5
6/// A console backed by an operating system.
7#[derive(Debug)]
8pub struct OsConsole {
9    stdout: Stdout,
10    stderr: Stderr,
11}
12
13impl OsConsole {
14    /// Creates a console.
15    pub fn new() -> Self {
16        Self {
17            stdout: stdout(),
18            stderr: stderr(),
19        }
20    }
21}
22
23impl Default for OsConsole {
24    fn default() -> Self {
25        Self::new()
26    }
27}
28
29#[async_trait]
30impl Console for OsConsole {
31    async fn write_stdout(&mut self, src: &[u8]) -> Result<(), Box<dyn Error>> {
32        self.stdout.write_all(src).await?;
33
34        Ok(())
35    }
36
37    async fn write_stderr(&mut self, src: &[u8]) -> Result<(), Box<dyn Error>> {
38        self.stderr.write_all(src).await?;
39
40        Ok(())
41    }
42
43    async fn flush(&mut self) -> Result<(), Box<dyn Error>> {
44        self.stdout.flush().await?;
45        self.stderr.flush().await?;
46
47        Ok(())
48    }
49}