use std::path::Path;
use crate::opslog::{self, DETACHED_EXIT, OpEntry, Origin};
use super::super::dispatch::Deps;
use opslog::launch::ADVANCE;
pub(crate) fn advance(deps: &Deps, ts: &str, workspace: &Path, agent: &str) -> Result<(), String> {
let ws_s = workspace.to_string_lossy();
let sink = opslog::detached::sink(&deps.state_root, ts, workspace);
let bound = deps.bound(workspace);
let spawn =
bound
.cli()
.spawn_detached(Some(workspace), &sink, &[ADVANCE, ws_s.as_ref(), agent]);
let argv = vec![
deps.litany.binary().display().to_string(),
ADVANCE.to_owned(),
ws_s.into_owned(),
agent.to_owned(),
];
let cwd = crate::nav::ws_key(workspace);
let entry = match spawn.as_ref().err() {
Some(e) => OpEntry::synthetic_failure(
ts.to_owned(),
argv,
cwd,
e.to_string(),
Origin::Conversation,
deps.caller.client.clone(),
),
None => OpEntry {
ts: ts.to_owned(),
argv,
cwd,
exit: DETACHED_EXIT,
stdout: String::new(),
stderr: String::new(),
origin: Origin::Conversation,
client: deps.caller.client.clone(),
},
};
opslog::append(&deps.state_root, &entry).map_err(|e| e.to_string())?;
spawn.map(|_pid| ()).map_err(|e| e.to_string())
}