tovuk 0.1.58

Deploy Rust backends, static frontends, and fullstack apps to Tovuk.
use super::super::{
    args::CliOptions,
    errors::{Result, agent_error},
    project::encode_component,
};
use super::{
    common::{app_route, command_arg},
    generic::{app_get_command, print_authenticated_mutation},
};
use reqwest::Method;
use serde_json::json;

pub(crate) fn env_command(cli: &CliOptions) -> Result<()> {
    match cli.args.first().map_or("list", String::as_str) {
        "list" => app_get_command(cli, "env"),
        "set" => env_set(cli),
        "delete" => env_delete(cli),
        _ => Err(agent_error(
            "unknown_command",
            "Unknown env command.",
            "Use `tovuk env list`, `env set`, or `env delete`.",
            cli.output.json,
        )),
    }
}

fn env_set(cli: &CliOptions) -> Result<()> {
    let assignment = cli.args.get(1).cloned().unwrap_or_default();
    let separator = assignment.find('=').unwrap_or(0);
    if separator == 0 {
        return Err(agent_error(
            "invalid_env",
            "Environment assignment must be KEY=value.",
            "Pass one uppercase shell-safe environment assignment, for example `API_KEY=value`.",
            cli.output.json,
        ));
    }
    let name = &assignment[..separator];
    let value = &assignment[separator + 1..];
    print_authenticated_mutation(
        cli,
        Method::PUT,
        &app_route(cli, "env")?,
        Some(json!({ "name": name, "value": value })),
    )
}

fn env_delete(cli: &CliOptions) -> Result<()> {
    let name = command_arg(
        cli,
        "invalid_env",
        "Environment variable name is required.",
        "Use `tovuk env delete --app <app> KEY`.",
    )?;
    print_authenticated_mutation(
        cli,
        Method::DELETE,
        &app_route(cli, &format!("env/{}", encode_component(&name)))?,
        None,
    )
}