use serde::Deserialize;
use crate::daemon::Client;
pub const ROUTE: &str = "/api/v1/machine";
pub const RENAME: &str = "/api/v1/machine/name";
#[derive(Deserialize)]
struct Named {
name: String,
}
pub fn name(new: Option<&str>) -> u8 {
match run(new) {
Ok(()) => 0,
Err(message) => {
crate::errln!("wsb machine: {message}");
1
}
}
}
fn run(new: Option<&str>) -> Result<(), String> {
let client = daemon()?;
match new {
None => {
let named: Named = client.get_json(ROUTE)?;
crate::outln!("{}", named.name);
}
Some(name) => {
let named: Named = client.post_json(RENAME, &serde_json::json!({ "name": name }))?;
crate::outln!("this machine is now called {}", named.name);
}
}
Ok(())
}
fn daemon() -> Result<Client, String> {
let machine_dir = crate::daemon::machine_dir()?;
let cwd = std::env::current_dir().map_err(|e| format!("cannot determine the current directory: {e}"))?;
let (client, _info, _started) =
crate::daemon::ensure_running(&machine_dir, &cwd, &crate::daemon::Spawn::default())?;
Ok(client)
}