Skip to main content

ssh_cli/
lib.rs

1//! # ssh-cli
2//!
3//! CLI Rust full-stack que dá a uma LLM (Claude Code, Cursor, Windsurf) a capacidade
4//! de operar servidores remotos via SSH em um fluxo de subprocesso via stdin/stdout.
5//!
6//! ## Módulos
7//!
8//! | Módulo          | Responsabilidade                                              |
9//! |-----------------|---------------------------------------------------------------|
10//! | `cli`           | Definição de argumentos via `clap` derive e dispatcher        |
11//! | `vps`           | CRUD e persistência de registros de VPS (XDG + TOML + 0o600)  |
12//! | `ssh`           | Cliente SSH (stub nesta iteração; real via `russh` em v2+)    |
13//! | `i18n`          | Internacionalização com enum `Mensagem` bilíngue              |
14//! | `locale`        | Detecção e resolução de locale do sistema operacional         |
15//! | `platform`      | Ajustes de plataforma (UTF-8 Windows, detecção TTY)           |
16//! | `mascaramento`  | Mascaramento Unicode-safe de valores sensíveis                |
17//! | `erros`         | Tipos de erro estruturados via `thiserror`                    |
18//! | `output`        | Único módulo autorizado a `println!` (formatação CRUD)        |
19//! | `paths`         | Validação e normalização de caminhos (anti-traversal, NFC)    |
20//! | `signals`       | Handler de Ctrl+C com flag de cancelamento via `AtomicBool`   |
21//! | `terminal`      | Detecção de TTY e escolha de cor via `termcolor`              |
22//!
23//! ## Entry point
24//!
25//! A função pública [`run`] é o ponto de entrada chamado por `main.rs`.
26
27#![cfg_attr(docsrs, feature(doc_cfg))]
28#![warn(missing_docs)]
29#![warn(rust_2018_idioms)]
30
31pub mod cli;
32pub mod erros;
33pub mod i18n;
34pub mod locale;
35pub mod mascaramento;
36pub mod output;
37pub mod paths;
38pub mod platform;
39pub mod scp;
40pub mod signals;
41pub mod ssh;
42pub mod terminal;
43pub mod tunnel;
44pub mod vps;
45
46use anyhow::Result;
47
48/// Executa o ssh-cli a partir dos argumentos da linha de comando.
49///
50/// Esta é a função pública chamada por `main.rs`. Ela:
51/// 1. Registra o handler de Ctrl+C para cancelamento gracioso.
52/// 2. Inicializa a plataforma (codepage Windows UTF-8, detecção de TTY).
53/// 3. Faz parsing dos argumentos via clap.
54/// 4. Inicializa logs via `tracing-subscriber`.
55/// 5. Inicializa configuração de cor do terminal.
56/// 6. Inicializa i18n com o idioma detectado.
57/// 7. Despacha para o subcomando apropriado (`vps`, `connect`, `exec`, `sudo-exec`, `scp`, `tunnel`).
58pub async fn run() -> Result<()> {
59    signals::registrar_handler()?;
60
61    platform::inicializar_plataforma()?;
62
63    let argumentos = cli::parse_args();
64
65    cli::inicializar_logs(&argumentos);
66
67    terminal::inicializar(argumentos.no_color)?;
68
69    i18n::inicializar_idioma(argumentos.lang.as_deref())?;
70
71    cli::executar(argumentos).await
72}