terrazzo-terminal 0.2.8

A simple web-based terminal emulator built on Terrazzo.
use std::sync::Arc;

use terrazzo::axum::extract::Json;
use trz_gateway_common::http_error::HttpError;
use trz_gateway_common::id::ClientName;
use uuid::Uuid;

use crate::api::shared::terminal_schema::NewTerminalRequest;
use crate::api::shared::terminal_schema::TabTitle;
use crate::api::shared::terminal_schema::TerminalAddress;
use crate::api::shared::terminal_schema::TerminalDef;
use crate::backend::Server;
use crate::backend::client_service::terminal_service;

pub async fn new_id(
    my_client_name: Option<ClientName>,
    server: Arc<Server>,
    Json(request): Json<NewTerminalRequest>,
) -> Result<Json<TerminalDef>, HttpError<self::terminal_service::new_id::NewIdError>> {
    let NewTerminalRequest {
        address: client_address,
        tile,
    } = request;
    let next = self::terminal_service::new_id::new_id(&server, &client_address).await?;
    let client_name = client_address.last().or(my_client_name.as_ref());

    let title = if let Some(client_name) = client_name {
        format!("Terminal {client_name}:{next}")
    } else {
        format!("Terminal {next}")
    };

    let id = if cfg!(feature = "concise-traces") {
        Uuid::new_v4().to_string()
    } else if let Some(client_name) = client_name {
        format!("T-{client_name}-{next}")
    } else {
        format!("T-{next}")
    }
    .into();
    Ok(Json(TerminalDef {
        address: TerminalAddress {
            id,
            via: client_address,
        },
        title: TabTitle {
            shell_title: title,
            override_title: None,
        },
        order: next,
        tile,
    }))
}