vihaco_stdlib/observer/
stdio.rs1use 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}