zagens-cli 0.8.3

Zagens headless CLI + HTTP/SSE runtime sidecar (`zagens`, `zagens-runtime` binaries)
Documentation
use std::io::{self, IsTerminal, Read};

use anyhow::{Result, bail};

use crate::config::{clear_api_key, save_api_key};

pub fn run_login(api_key: Option<String>) -> Result<()> {
    let api_key = match api_key {
        Some(key) => key,
        None => read_api_key_from_stdin()?,
    };
    let saved = save_api_key(&api_key)?;
    println!("Saved API key to {}", saved.describe());
    Ok(())
}

pub fn run_logout() -> Result<()> {
    clear_api_key()?;
    println!("Cleared saved API key.");
    Ok(())
}

fn read_api_key_from_stdin() -> Result<String> {
    let mut stdin = io::stdin();
    if stdin.is_terminal() {
        bail!("No API key provided. Pass --api-key or pipe one via stdin.");
    }
    let mut buffer = String::new();
    stdin.read_to_string(&mut buffer)?;
    let api_key = buffer.trim().to_string();
    if api_key.is_empty() {
        bail!("No API key provided via stdin.");
    }
    Ok(api_key)
}