Skip to main content

turtle_build/infrastructure/
console.rs

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