use crate::cli::ExecArgs;
use crate::commands::request::server_request;
use reqwest::Client;
use serde::Deserialize;
use std::error::Error as StdError;
pub async fn exec_cmd(args: ExecArgs) -> Result<(), Box<dyn StdError>> {
let container_id = fetch_container_id_from_api(&args.namespace, &args.name).await?;
let output = nebulous::ssh::exec::run_ssh_command_ts(
&format!("container-{}", container_id),
args.command
.split_whitespace()
.map(|s| s.to_string())
.collect(),
args.interactive,
args.tty,
Some("root"), )?;
println!("{}", output);
Ok(())
}
async fn fetch_container_id_from_api(
namespace: &str,
name: &str,
) -> Result<String, Box<dyn StdError>> {
let url = format!("/v1/containers/{}/{}", namespace, name);
let response = server_request(&url, reqwest::Method::GET).await?;
let container = response
.error_for_status()? .json::<V1Container>()
.await?;
Ok(container.metadata.id)
}
#[derive(Deserialize)]
struct V1Container {
metadata: V1ResourceMeta,
}
#[derive(Deserialize)]
struct V1ResourceMeta {
pub id: String,
}