1use anyhow::Result;
2use std::path::Path;
3
4pub fn run(root: &Path, username: &str, inferred: bool) -> Result<()> {
5 if inferred {
6 eprintln!("Registering as: {username}");
7 }
8 let config = apm_core::config::Config::load(root)?;
9 let url = format!("{}/api/auth/otp", config.server.url);
10 let body = serde_json::json!({"username": username});
11 let client = reqwest::blocking::Client::new();
12 let resp = client
13 .post(&url)
14 .json(&body)
15 .send()
16 .map_err(|e| anyhow::anyhow!("error: cannot connect to apm-server: {e}"))?;
17 if !resp.status().is_success() {
18 let status = resp.status();
19 eprintln!("error: server returned {status}");
20 std::process::exit(1);
21 }
22 let json: serde_json::Value = resp
23 .json()
24 .map_err(|e| anyhow::anyhow!("error: invalid response from server: {e}"))?;
25 let otp = json
26 .get("otp")
27 .and_then(|v| v.as_str())
28 .ok_or_else(|| anyhow::anyhow!("error: missing otp field in response"))?;
29 println!("{otp}");
30 Ok(())
31}