//! `swarmctl forge make-admin` — make an existing human forge account a site //! admin, through the swarm-controller over the forge's admin API. //! //! Unlike the `agent` verbs this one waits: the controller answers with what //! it found. Same round trip as [`crate::agent`], over the controller's unix //! socket. use anyhow::{Context as _, Result}; use swarm_controller_api::forge::{ForgeAdminChange, MakeForgeAdminResponse}; use crate::agent::{parse_ident, post}; use crate::remote::Target; /// Run `swarmctl forge make-admin`. /// /// Synchronous for the same reason `agent create` is. pub(crate) fn make_admin(target: &Target, name: &str) -> Result<()> { let name = parse_ident(name, "user name")?; let rt = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .context("starting a tokio runtime for the controller request")?; let resp: MakeForgeAdminResponse = rt.block_on(post( target, &format!("/api/forge/users/{name}/admin"), &serde_json::json!({}), "forge-make-admin", ))?; match resp.change { ForgeAdminChange::Promoted => println!("forge: {name:?} is now a site admin"), ForgeAdminChange::AlreadyAdmin => println!("forge: {name:?} was already a site admin"), } Ok(()) }