Документация для io::write_all
гласит:
Любая ошибка, возникающая во время записи, приведет к уничтожению как потока, так и буфера.
Поскольку ваш код, похоже, пытается отправить сетевое сообщение, чтобы указать, что предыдущее сетевое сообщение не удалось (что кажется ... сомнительным), TcpStream
уже исчезнет к тому времени, когда вы попытаетесь отправить второе сообщение.
Таким образом, самое простое решение - клонировать поток:
let stream2 = stream.try_clone().expect("Couldn't clone");
let task = database_connection
.and_then(|_| io::write_all(stream, b"success"))
.map_err(|_| io::write_all(stream2, b"error"));
Если вы только хотите попытаться сообщить о сбое соединения с базой данных, это намного проще: используйте Future::then
вместо and_then
:
let task = database_connection.then(|connection| match connection {
Ok(_) => io::write_all(stream, &b"success"[..]),
Err(_) => io::write_all(stream2, &b"error"[..]),
});