zoi-cli 1.25.4

Advanced Package Manager & Environment Orchestrator
Documentation
//! Telemetry command implementation.

use anyhow::Result;
use colored::Colorize;

/// Telemetry subcommands.
#[derive(Debug, Clone, Copy)]
pub enum TelemetryCommand {
    /// Show telemetry status.
    Status,
    /// Enable telemetry.
    Enable,
    /// Disable telemetry.
    Disable
}

/// Run the telemetry command.
///
/// # Errors
///
/// Returns an error if the configuration cannot be read or written.
pub fn run(cmd: TelemetryCommand) -> Result<()> {
    match cmd {
        TelemetryCommand::Status => {
            let cfg = crate::pkg::config::read_config()?;
            let status = if cfg.telemetry_enabled {
                "Enabled".green()
            } else {
                "Disabled".yellow()
            };
            println!(
                "{} telemetry is currently {}.",
                "::".bold().blue(),
                status
            );

            if cfg.telemetry_enabled {
                let id = crate::pkg::telemetry::get_anonymous_id();
                println!("Anonymous Client ID: {}", id.cyan());
                println!(
                    "\nThank you for helping us improve Zoi! We collect \
                     minimal, anonymous data about:"
                );
                println!(
                    "- {} (OS, Arch, Distro, Shell)",
                    "Environment".bold()
                );
                println!("- {} (Action, Scope, Reason)", "Operations".bold());
                println!(
                    "- {} (Name, Version, Repo, License)",
                    "Package Metadata".bold()
                );
            } else {
                println!(
                    "\nTelemetry is anonymous and helps us prioritize \
                     features and platforms."
                );
                println!("Run 'zoi telemetry enable' to help the project.");
            }
        }
        TelemetryCommand::Enable => {
            let mut cfg = crate::pkg::config::read_user_config()?;

            println!(
                "{}",
                "Notice: Enabling telemetry shares anonymous usage data to \
                 help improve Zoi."
                    .dimmed()
            );
            println!(
                "{}",
                "No personal data or IP addresses are ever collected.".dimmed()
            );
            println!(
                "{} {}",
                "Full Privacy Policy:".dimmed(),
                "https://zillowe.qzz.io/legal/privacy".cyan()
            );

            cfg.telemetry_enabled = true;
            crate::pkg::config::write_user_config(&cfg)?;
            println!("{} telemetry enabled", "Success:".green());
        }
        TelemetryCommand::Disable => {
            let mut cfg = crate::pkg::config::read_user_config()?;
            cfg.telemetry_enabled = false;
            crate::pkg::config::write_user_config(&cfg)?;
            println!("{} telemetry disabled", "Success:".green());
        }
    }
    Ok(())
}