Handle server start failed #4

Merged
pierre merged 2 commits from GwenLg/GrammalecteClient:server_start_failed into master 2024-06-14 16:46:40 +00:00
Showing only changes of commit ed20b3c2bc - Show all commits

View File

@ -16,6 +16,9 @@ pub enum Error {
#[error("Server exit with `{status}`")] #[error("Server exit with `{status}`")]
ServerExitWithStatus { status: ExitStatus }, ServerExitWithStatus { status: ExitStatus },
#[error("Server exit with `{status}` :\n{msg}")]
ServerExitWithError { status: ExitStatus, msg: String },
#[error("Error append during check grammalecte-server status")] #[error("Error append during check grammalecte-server status")]
ServerCheckStatus(#[source] io::Error), ServerCheckStatus(#[source] io::Error),
@ -91,7 +94,7 @@ impl EmbeddedServer {
.arg("-p") .arg("-p")
.arg(port.to_string()) .arg(port.to_string())
.stdout(Stdio::null()) .stdout(Stdio::null())
.stderr(Stdio::null()) .stderr(Stdio::piped())
.spawn() .spawn()
.map_err(Error::StartServerProcess)?; .map_err(Error::StartServerProcess)?;
@ -118,6 +121,8 @@ impl Drop for EmbeddedServer {
mod utils { mod utils {
use super::Error; use super::Error;
use std::fmt::Write;
use std::io::{BufRead, BufReader};
use std::process::Child; use std::process::Child;
use std::time::Duration; use std::time::Duration;
@ -151,7 +156,24 @@ mod utils {
fn check_server(child: &mut Child) -> Result<(), Error> { fn check_server(child: &mut Child) -> Result<(), Error> {
match child.try_wait().map_err(Error::ServerCheckStatus)? { match child.try_wait().map_err(Error::ServerCheckStatus)? {
None => Ok(()), // Continue 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 })
}
}
} }
} }
} }