pipe.rs 949 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use super::{Open, Sink};
  2. use std::fs::OpenOptions;
  3. use std::io::{self, Write};
  4. use std::mem;
  5. use std::slice;
  6. pub struct StdoutSink(Box<dyn Write>);
  7. impl Open for StdoutSink {
  8. fn open(path: Option<String>) -> StdoutSink {
  9. if let Some(path) = path {
  10. let file = OpenOptions::new().write(true).open(path).unwrap();
  11. StdoutSink(Box::new(file))
  12. } else {
  13. StdoutSink(Box::new(io::stdout()))
  14. }
  15. }
  16. }
  17. impl Sink for StdoutSink {
  18. fn start(&mut self) -> io::Result<()> {
  19. Ok(())
  20. }
  21. fn stop(&mut self) -> io::Result<()> {
  22. Ok(())
  23. }
  24. fn write(&mut self, data: &[i16]) -> io::Result<()> {
  25. let data: &[u8] = unsafe {
  26. slice::from_raw_parts(
  27. data.as_ptr() as *const u8,
  28. data.len() * mem::size_of::<i16>(),
  29. )
  30. };
  31. self.0.write_all(data)?;
  32. self.0.flush()?;
  33. Ok(())
  34. }
  35. }