turtle_build/infrastructure/
console.rs1#[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#[derive(Debug)]
18pub struct OsConsole {
19 stdout: Stdout,
20 stderr: Stderr,
21}
22
23impl OsConsole {
24 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}