cred 0.3.1

A command-line tool to manage secrets and environment variables locally and remotely.
Documentation
use crate::cli::CliFlags;
use crate::error::AppError;
use anyhow::{self, Context};
use rpassword::prompt_password;

pub fn require_yes(flags: &CliFlags, action: &str) -> Result<(), AppError> {
    if !flags.yes {
        return Err(AppError::user(anyhow::anyhow!(
            "{} is destructive; rerun with --yes",
            action
        )));
    }
    Ok(())
}

pub fn print_out(flags: &CliFlags, msg: &str) {
    if !flags.json && !flags.no_color {
        println!("{}", msg);
    } else if !flags.json {
        println!("{}", msg);
    }
}

pub fn print_plain(msg: &str) {
    println!("{}", msg);
}

pub fn print_plain_err(msg: &str) {
    eprintln!("{}", msg);
}

pub fn print_json(payload: &serde_json::Value) {
    print_plain(&serde_json::to_string(payload).unwrap_or_default());
}

pub fn print_err(flags: &CliFlags, msg: &str) {
    if !flags.json && !flags.no_color {
        eprintln!("{}", msg);
    } else if !flags.json {
        eprintln!("{}", msg);
    }
}

pub fn read_token_securely(
    maybe_token: Option<String>,
    flags: &CliFlags,
) -> Result<String, AppError> {
    match maybe_token {
        Some(token) => Ok(token),
        None => {
            if flags.non_interactive {
                return Err(AppError::user(anyhow::anyhow!(
                    "--non-interactive set; token must be provided via --token"
                )));
            }
            let token = prompt_password("Enter target token: ")
                .context("Failed to read token securely")
                .map_err(AppError::user)?;

            if token.trim().is_empty() {
                return Err(AppError::user(anyhow::anyhow!("Token cannot be empty")));
            }

            Ok(token)
        }
    }
}