Skip to main content

vihaco_stdlib/observer/
stdio.rs

1// SPDX-FileCopyrightText: 2026 The vihaco Authors
2// SPDX-License-Identifier: MIT
3
4use std::io::Write;
5
6use eyre::Result;
7use vihaco_runtime::{Effects, observe};
8
9#[derive(Debug, Clone)]
10pub struct StdoutEffect(pub String);
11
12#[derive(Debug, Default)]
13pub struct StdoutObserver {
14    output: std::io::Cursor<Vec<u8>>,
15}
16
17impl StdoutObserver {
18    pub fn write_stdout(&mut self, text: &str) -> Result<()> {
19        self.output.write_all(text.as_bytes())?;
20        Ok(())
21    }
22
23    pub fn output(&self) -> &[u8] {
24        self.output.get_ref()
25    }
26}
27
28#[observe(StdoutEffect)]
29impl StdoutObserver {
30    fn observe_stdout_effect(&mut self, effect: &StdoutEffect) -> Result<Effects<()>> {
31        self.write_stdout(&effect.0)?;
32        Ok(Effects::none())
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn write_stdout_appends_bytes() {
42        let mut observer = StdoutObserver::default();
43
44        observer.write_stdout("hello").unwrap();
45        observer.write_stdout(" world").unwrap();
46
47        assert_eq!(observer.output(), b"hello world");
48    }
49}