use anyhow::{Context, Result};
use clap::Parser;
use crate::client::GQLClient;
use crate::config::Configs;
pub const SSH_CONNECTION_TIMEOUT_SECS: u64 = 30;
pub const SSH_MESSAGE_TIMEOUT_SECS: u64 = 10;
pub const SSH_MAX_RECONNECT_ATTEMPTS: usize = 3;
pub const SSH_RECONNECT_DELAY_SECS: u64 = 5;
pub const SSH_MAX_EMPTY_MESSAGES: usize = 100;
mod common;
mod platform;
use common::*;
use platform::*;
#[derive(Parser, Clone)]
pub struct Args {
#[clap(short, long)]
project: Option<String>,
#[clap(short, long)]
service: Option<String>,
#[clap(short, long)]
environment: Option<String>,
#[clap(short, long)]
#[arg(long = "deployment-instance", value_name = "deployment-instance-id")]
deployment_instance: Option<String>,
#[clap(trailing_var_arg = true)]
command: Vec<String>,
}
pub async fn command(args: Args, _json: bool) -> Result<()> {
let configs = Configs::new()?;
let client = GQLClient::new_authorized(&configs)?;
let params = get_ssh_connect_params(args.clone(), &configs, &client).await?;
let token = configs
.get_railway_auth_token()
.context("No authentication token found. Please login first with 'railway login'")?;
let running_command = !args.command.is_empty();
let spinner = create_spinner(running_command);
let ws_url = format!("wss://{}", configs.get_relay_host_path());
let mut terminal_client = establish_connection(&ws_url, &token, ¶ms).await?;
if running_command {
execute_command(&mut terminal_client, args.command, spinner).await
} else {
initialize_shell(&mut terminal_client, Some("bash".to_string()), spinner).await?;
run_interactive_session(&mut terminal_client).await
}
}