use std::error::Error; use std::fs; use ipnet::Ipv4Net; use serde::{Deserialize, Serialize}; use url::Url; use crate::OrgCommands; use crate::api::APIErrorResponse; pub async fn org_main(command: OrgCommands, server: Url) -> Result<(), Box> { match command { OrgCommands::Create { cidr } => create_org(cidr, server).await, } } #[derive(Serialize)] pub struct CreateOrgBody { pub cidr: String } #[derive(Deserialize)] pub struct OrgCreateResponse { pub organization: String, pub ca: String, pub network: String } pub async fn create_org(cidr: Ipv4Net, server: Url) -> Result<(), Box> { let client = reqwest::Client::new(); let sess_token_store = dirs::config_dir().unwrap().join("tfcli-session.token"); let session_token = fs::read_to_string(&sess_token_store)?; let auth_token_store = dirs::config_dir().unwrap().join("tfcli-auth.token"); let auth_token = fs::read_to_string(&auth_token_store)?; let token = format!("{} {}", session_token, auth_token); let res = client.post(server.join("/v1/organization")?).json(&CreateOrgBody { cidr: cidr.to_string() }).bearer_auth(token).send().await?; if res.status().is_success() { let resp: OrgCreateResponse = res.json().await?; println!("Created organization successfully."); println!("Organization: {}", resp.organization); println!(" Signing CA: {}", resp.ca); println!(" Network: {}", resp.network); } else { let resp: APIErrorResponse = res.json().await?; eprintln!("[error] Error creating org: {} {}", resp.errors[0].code, resp.errors[0].message); std::process::exit(1); } Ok(()) }