add err output when server failed to start

This commit is contained in:
Gwen Lg 2024-06-13 22:16:45 +02:00
parent 929fa56bed
commit 89f3bd5d71

View File

@ -17,6 +17,9 @@ pub enum Error {
#[error("Server exit with `{status}`")]
ServerExitWithStatus { status: ExitStatus },
#[error("Server exit with `{status}` :\n{msg}")]
ServerExitWithError { status: ExitStatus, msg: String },
#[error("Error append during check grammalecte-server status")]
ServerCheckStatus(#[source] io::Error),
@ -92,7 +95,7 @@ impl EmbeddedServer {
.arg("-p")
.arg(port.to_string())
.stdout(Stdio::null())
.stderr(Stdio::null())
.stderr(Stdio::piped())
.spawn()
.map_err(Error::StartServerProcess)?;
@ -119,6 +122,8 @@ impl Drop for EmbeddedServer {
mod utils {
use super::Error;
use std::fmt::Write;
use std::io::{BufRead, BufReader, ErrorKind};
use std::process::Child;
use std::time::Duration;
@ -152,7 +157,24 @@ mod utils {
fn check_server(child: &mut Child) -> Result<(), Error> {
match child.try_wait().map_err(Error::ServerCheckStatus)? {
None => Ok(()), // Continue
Some(status) => Err(Error::ServerExitWithStatus { status }),
Some(status) => {
if let Some(err) = child.stderr.take() {
let mut msg = format!("grammalecte-server exit with `{status}`");
writeln!(&mut msg, " :").unwrap();
let err = BufReader::new(err);
err.lines().for_each(|line| match line {
Ok(line) => {
writeln!(&mut msg, "\t{}", line).unwrap();
}
Err(err) => {
writeln!(&mut msg, "__{err:?}").unwrap();
}
});
Err(Error::ServerExitWithError { status, msg })
} else {
Err(Error::ServerExitWithStatus { status })
}
}
}
}
}