start contextuel : am start sans argument lance l'agent par defaut du projet (issue #30) - resolution pure resolve_start_target, restart identique, REPL sans agent obligatoire
This commit is contained in:
+21
-4
@@ -11,10 +11,25 @@ use std::ffi::OsString;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
|
||||
/// Resolve the start target: the explicit agent/alias/group when given,
|
||||
/// otherwise the default agent of the project containing cwd (issue #30).
|
||||
pub fn resolve_start_target(app: &App, cwd: &std::path::Path, agent: Option<&str>) -> Result<String> {
|
||||
if let Some(a) = agent.filter(|s| !s.is_empty()) {
|
||||
return Ok(a.to_string());
|
||||
}
|
||||
crate::projects::default_agent_for_dir(app, cwd).ok_or_else(|| {
|
||||
anyhow!(
|
||||
"no agent given — set default_agent in this project's profile ('am init' does it) or pass an agent name"
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn start(app: &App, opts: &StartArgs) -> Result<i32> {
|
||||
let cwd = std::env::current_dir().unwrap_or_default();
|
||||
let target = resolve_start_target(app, &cwd, opts.agent.as_deref())?;
|
||||
let extra_env = parse_env_list(&opts.env)?;
|
||||
let extra_args = parse_extra_args(&opts.args);
|
||||
if let Some(group) = crate::catalog::Catalog::parse_group_selector(&opts.agent) {
|
||||
if let Some(group) = crate::catalog::Catalog::parse_group_selector(&target) {
|
||||
let members = app.catalog.group_members(group);
|
||||
if members.is_empty() {
|
||||
bail!("unknown group '{group}'");
|
||||
@@ -24,7 +39,7 @@ pub fn start(app: &App, opts: &StartArgs) -> Result<i32> {
|
||||
}
|
||||
return Ok(0);
|
||||
}
|
||||
let agent = require_agent(app, &opts.agent)?;
|
||||
let agent = require_agent(app, &target)?;
|
||||
start_one(app, agent, &extra_args, &extra_env, opts.notify, opts.background)
|
||||
}
|
||||
|
||||
@@ -197,7 +212,9 @@ fn stop_one(app: &App, agent: &AgentDef, force: bool, timeout: u64) -> Result<i3
|
||||
|
||||
pub fn restart(app: &App, opts: &StartArgs, force: bool, timeout: Option<u64>) -> Result<i32> {
|
||||
let timeout = timeout.unwrap_or_else(|| app.config.settings.stop_timeout());
|
||||
if let Some(group) = crate::catalog::Catalog::parse_group_selector(&opts.agent) {
|
||||
let cwd = std::env::current_dir().unwrap_or_default();
|
||||
let target = resolve_start_target(app, &cwd, opts.agent.as_deref())?;
|
||||
if let Some(group) = crate::catalog::Catalog::parse_group_selector(&target) {
|
||||
let members = app.catalog.group_members(group);
|
||||
if members.is_empty() {
|
||||
bail!("unknown group '{group}'");
|
||||
@@ -212,7 +229,7 @@ pub fn restart(app: &App, opts: &StartArgs, force: bool, timeout: Option<u64>) -
|
||||
}
|
||||
return Ok(0);
|
||||
}
|
||||
let agent = require_agent(app, &opts.agent)?;
|
||||
let agent = require_agent(app, &target)?;
|
||||
stop_one(app, agent, force, timeout)?;
|
||||
let extra_env = parse_env_list(&opts.env)?;
|
||||
let extra_args = parse_extra_args(&opts.args);
|
||||
|
||||
Reference in New Issue
Block a user