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 serde_json::{Map, Value};

pub(crate) fn insert_optional(body: &mut Map<String, Value>, key: &str, value: &str) {
    if !value.is_empty() {
        body.insert(key.to_owned(), Value::String(value.to_owned()));
    }
}

pub(crate) fn command_arg(
    cli: &CliOptions,
    code: &str,
    message: &str,
    instruction: &str,
) -> Result<String> {
    cli.args
        .get(1)
        .cloned()
        .filter(|value| !value.is_empty())
        .ok_or_else(|| agent_error(code, message, instruction, cli.output.json))
}

pub(crate) fn require_app(cli: &CliOptions) -> Result<String> {
    if cli.app.is_empty() {
        return Err(agent_error(
            "missing_app",
            "App is required.",
            "Pass `--app <app>` using either the app name from tovuk.toml or the app id printed by deploy.",
            cli.output.json,
        ));
    }
    Ok(cli.app.clone())
}

pub(crate) fn app_route(cli: &CliOptions, suffix: &str) -> Result<String> {
    Ok(format!(
        "/v1/apps/{}/{}",
        encode_component(&require_app(cli)?),
        suffix
    ))
}

pub(crate) fn page_query(cli: &CliOptions) -> String {
    let mut params = Vec::new();
    if !cli.limit.is_empty() {
        params.push(format!("limit={}", encode_component(&cli.limit)));
    }
    if !cli.cursor.is_empty() {
        params.push(format!("cursor={}", encode_component(&cli.cursor)));
    }
    if params.is_empty() {
        String::new()
    } else {
        format!("?{}", params.join("&"))
    }
}