add user_error stream (#917)
This commit is contained in:
@@ -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(_)
|
||||
|
||||
Reference in New Issue
Block a user