rustauth-cli 0.2.0

Command-line tools for RustAuth.
Documentation
use rustauth_core::options::RustAuthOptions;
use rustauth_core::plugin::AuthPlugin;
use rustauth_telemetry::{
    create_telemetry, get_telemetry_auth_config, TelemetryContext, TelemetryEvent,
};
use serde_json::{Map, Value};

use crate::config::CliConfig;

pub(crate) async fn publish_generate(config: &CliConfig, outcome: &'static str) {
    publish_cli_event(config, "cli_generate", outcome, Map::new()).await;
}

pub(crate) async fn publish_generate_with_extra(
    config: &CliConfig,
    outcome: &'static str,
    extra: Map<String, Value>,
) {
    publish_cli_event(config, "cli_generate", outcome, extra).await;
}

pub(crate) async fn publish_migrate(config: &CliConfig, outcome: &'static str) {
    publish_cli_event(config, "cli_migrate", outcome, Map::new()).await;
}

#[allow(dead_code)]
pub(crate) async fn publish_migrate_with_extra(
    config: &CliConfig,
    outcome: &'static str,
    extra: Map<String, Value>,
) {
    publish_cli_event(config, "cli_migrate", outcome, extra).await;
}

pub(crate) async fn publish_cli_event_for_command(
    config: &CliConfig,
    command: &'static str,
    outcome: &'static str,
    extra: Map<String, Value>,
) {
    let event_type = match command {
        "generate" => "cli_generate",
        "migrate" => "cli_migrate",
        _ => "cli_generate",
    };
    publish_cli_event(config, event_type, outcome, extra).await;
}

async fn publish_cli_event(
    config: &CliConfig,
    event_type: &'static str,
    outcome: &'static str,
    extra: Map<String, Value>,
) {
    let options = telemetry_options(config);
    let context = telemetry_context(config);
    let publisher = create_telemetry(&options, context.clone()).await;
    publisher
        .publish(TelemetryEvent {
            event_type: event_type.to_owned(),
            anonymous_id: None,
            payload: cli_payload(&options, &context, outcome, extra),
        })
        .await;
}

fn telemetry_options(config: &CliConfig) -> RustAuthOptions {
    let mut options = RustAuthOptions::new()
        .base_url(config.project.base_url.clone())
        .base_path(config.project.base_path.clone())
        .production(config.project.production);

    options.plugins = config
        .plugins
        .enabled
        .iter()
        .map(|id| AuthPlugin::new(id.clone()))
        .collect();
    options
}

fn telemetry_context(config: &CliConfig) -> TelemetryContext {
    TelemetryContext {
        adapter: Some(config.database.adapter.clone()),
        database: config.database.provider.clone(),
        ..TelemetryContext::default()
    }
}

fn cli_payload(
    options: &RustAuthOptions,
    context: &TelemetryContext,
    outcome: &'static str,
    extra: Map<String, Value>,
) -> Value {
    let mut payload = Map::new();
    payload.insert("outcome".to_owned(), Value::String(outcome.to_owned()));
    payload.extend(extra);
    payload.insert(
        "config".to_owned(),
        get_telemetry_auth_config(options, context),
    );
    Value::Object(payload)
}