use std::path::Path;
use cuenv_events::{emit_service_restarting, emit_stdout};
use cuenv_services::session::SessionManager;
pub struct RestartOptions {
pub path: String,
pub package: String,
pub services: Vec<String>,
}
pub fn execute_restart(options: &RestartOptions) -> cuenv_core::Result<String> {
let project_path = Path::new(&options.path);
let session = SessionManager::load(project_path)
.map_err(|e| cuenv_core::Error::execution(format!("Failed to load session: {e}")))?;
if !session.is_alive() {
return Err(cuenv_core::Error::execution(
"No active cuenv up session is running. Start services with `cuenv up` first.",
));
}
for name in &options.services {
let state = session.read_service(name).map_err(|e| {
cuenv_core::Error::execution(format!("Service '{name}' not found: {e}"))
})?;
emit_service_restarting!(name, "manual", state.restarts + 1);
emit_stdout!(format!("Restart signal sent to service '{name}'."));
}
emit_stdout!("Restart signals sent. The running `cuenv up` session will restart the services.");
Ok(String::new())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_restart_options() {
let options = RestartOptions {
path: ".".to_string(),
package: "cuenv".to_string(),
services: vec!["db".to_string()],
};
assert_eq!(options.services.len(), 1);
}
}