Documentation
use anyhow::Error;
use async_trait::async_trait;
use std::fs::File;
use std::io::Write;
use wasmtime_wasi::{HostOutputStream, StdoutStream, StreamError, StreamResult, Subscribe};

pub struct LogStream {
    pub output: File,
}

impl StdoutStream for LogStream {
    fn stream(&self) -> Box<dyn HostOutputStream> {
        Box::new(LogStream {
            output: self.output.try_clone().expect(""),
        })
    }

    fn isatty(&self) -> bool {
        false
    }
}

impl HostOutputStream for LogStream {
    fn write(&mut self, bytes: bytes::Bytes) -> StreamResult<()> {
        self.output
            .write_all(bytes.as_ref())
            .map_err(|e| StreamError::LastOperationFailed(Error::from(e)))
    }

    fn flush(&mut self) -> StreamResult<()> {
        self.output
            .flush()
            .map_err(|e| StreamError::LastOperationFailed(Error::from(e)))
    }

    fn check_write(&mut self) -> StreamResult<usize> {
        Ok(1024 * 1024)
    }
}

#[async_trait]
impl Subscribe for LogStream {
    async fn ready(&mut self) {}
}