use std::collections::BTreeMap;
use std::path::PathBuf;
use tokio_util::sync::CancellationToken;
use crate::engine::program::{PhpProgram, run_console};
#[derive(Clone, Debug)]
pub struct PhpConsole {
pub script: PathBuf,
pub args: Vec<String>,
pub cwd: PathBuf,
pub environment: BTreeMap<String, String>,
pub cancellation: CancellationToken,
}
impl PhpConsole {
pub fn run(self) -> Result<i32, String> {
if self.cancellation.is_cancelled() {
return Err("PHP console execution cancelled".into());
}
let cwd = std::fs::canonicalize(&self.cwd)
.map_err(|error| format!("PHP console cwd: {error}"))?;
let script = if self.script.is_absolute() {
self.script
} else {
cwd.join(self.script)
};
let script = std::fs::canonicalize(&script).map_err(|error| {
format!("PHP console script {}: {error}", script.display())
})?;
let program = PhpProgram::new(
script.display().to_string(),
script,
self.args,
Some(cwd),
self.environment,
None,
);
std::thread::Builder::new()
.name("php-console".into())
.spawn(move || run_console(program, self.cancellation))
.map_err(|error| error.to_string())?
.join()
.map_err(|_| "PHP console thread panicked".to_owned())?
}
}