Skip to main content

turtle_build/infrastructure/console/
os.rs

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