add user_error stream (#917)

This commit is contained in:
Mark Thom
2021-04-30 21:58:03 -06:00
parent bba836dc31
commit d0b25de554
10 changed files with 228 additions and 223 deletions

View File

@@ -14,7 +14,7 @@ use std::fmt;
use std::fs::File;
use std::hash::{Hash, Hasher};
use std::io;
use std::io::{stdout, Cursor, ErrorKind, Read, Seek, SeekFrom, Write};
use std::io::{stderr, stdout, Cursor, ErrorKind, Read, Seek, SeekFrom, Write};
use std::mem;
use std::net::{Shutdown, TcpStream};
use std::ops::DerefMut;
@@ -114,6 +114,7 @@ enum StreamInstance {
PausedPrologStream(Vec<u8>, Box<StreamInstance>),
ReadlineStream(ReadlineStream),
StaticStr(Cursor<&'static str>),
Stderr,
Stdout,
TcpStream(ClauseName, TcpStream),
TlsStream(ClauseName, TlsStream<TcpStream>),
@@ -148,12 +149,13 @@ impl StreamInstance {
StreamInstance::ReadlineStream(ref mut rl_stream) => rl_stream.read(buf),
StreamInstance::StaticStr(ref mut src) => src.read(buf),
StreamInstance::Bytes(ref mut cursor) => cursor.read(buf),
StreamInstance::OutputFile(..) | StreamInstance::Stdout | StreamInstance::Null => {
Err(std::io::Error::new(
ErrorKind::PermissionDenied,
StreamError::ReadFromOutputStream,
))
}
StreamInstance::OutputFile(..)
| StreamInstance::Stderr
| StreamInstance::Stdout
| StreamInstance::Null => Err(std::io::Error::new(
ErrorKind::PermissionDenied,
StreamError::ReadFromOutputStream,
)),
}
}
}
@@ -186,6 +188,7 @@ impl fmt::Debug for StreamInstance {
&StreamInstance::ReadlineStream(ref readline_stream) => {
write!(fmt, "ReadlineStream({:?})", readline_stream)
}
&StreamInstance::Stderr => write!(fmt, "Stderr"),
&StreamInstance::Stdout => write!(fmt, "Stdout"),
&StreamInstance::TcpStream(_, ref tcp_stream) => {
write!(fmt, "TcpStream({:?})", tcp_stream)
@@ -521,7 +524,9 @@ impl Stream {
| StreamInstance::InputFile(..) => "read",
StreamInstance::TcpStream(..) | StreamInstance::TlsStream(..) => "read_append",
StreamInstance::OutputFile(_, _, true) => "append",
StreamInstance::Stdout | StreamInstance::OutputFile(_, _, false) => "write",
StreamInstance::Stderr
| StreamInstance::Stdout
| StreamInstance::OutputFile(_, _, false) => "write",
StreamInstance::Null => "",
}
}
@@ -538,6 +543,11 @@ impl Stream {
Stream::from_inst(StreamInstance::Stdout)
}
#[inline]
pub fn stderr() -> Self {
Stream::from_inst(StreamInstance::Stderr)
}
#[inline]
pub(crate) fn from_tcp_stream(address: ClauseName, tcp_stream: TcpStream) -> Self {
tcp_stream.set_read_timeout(None).unwrap();
@@ -561,6 +571,14 @@ impl Stream {
Stream::from_inst(StreamInstance::InputFile(name, file))
}
#[inline]
pub(crate) fn is_stderr(&self) -> bool {
match self.stream_inst.0.borrow().stream_inst {
StreamInstance::Stderr => true,
_ => false,
}
}
#[inline]
pub(crate) fn is_stdout(&self) -> bool {
match self.stream_inst.0.borrow().stream_inst {
@@ -608,7 +626,8 @@ impl Stream {
#[inline]
pub(crate) fn is_output_stream(&self) -> bool {
match self.stream_inst.0.borrow().stream_inst {
StreamInstance::Stdout
StreamInstance::Stderr
| StreamInstance::Stdout
| StreamInstance::TcpStream(..)
| StreamInstance::TlsStream(..)
| StreamInstance::Bytes(_)
@@ -1110,6 +1129,7 @@ impl Write for Stream {
StreamInstance::TlsStream(_, ref mut tls_stream) => tls_stream.write(buf),
StreamInstance::Bytes(ref mut cursor) => cursor.write(buf),
StreamInstance::Stdout => stdout().write(buf),
StreamInstance::Stderr => stderr().write(buf),
StreamInstance::PausedPrologStream(..)
| StreamInstance::StaticStr(_)
| StreamInstance::ReadlineStream(_)
@@ -1127,6 +1147,7 @@ impl Write for Stream {
StreamInstance::TcpStream(_, ref mut tcp_stream) => tcp_stream.flush(),
StreamInstance::TlsStream(_, ref mut tls_stream) => tls_stream.flush(),
StreamInstance::Bytes(ref mut cursor) => cursor.flush(),
StreamInstance::Stderr => stderr().flush(),
StreamInstance::Stdout => stdout().flush(),
StreamInstance::PausedPrologStream(..)
| StreamInstance::StaticStr(_)