73 lines
2.4 KiB
Markdown
73 lines
2.4 KiB
Markdown
# PR-006: CLI Preserve Child Exit Status
|
|
|
|
## Briefing
|
|
|
|
O wrapper `prometeu` despacha para outros binarios do ecossistema. Hoje, se o processo filho terminar sem exit code convencional, o CLI usa `unwrap_or(0)` e pode reportar sucesso mesmo quando houve abort, sinal ou encerramento anormal.
|
|
|
|
Este PR corrige a propagacao de status do processo filho para tornar o CLI confiavel em automacao, CI e uso por scripts.
|
|
|
|
## Problema
|
|
|
|
- `status.code()` pode retornar `None`.
|
|
- `unwrap_or(0)` transforma falha anormal em sucesso.
|
|
- Isso mascara erros reais em `run`, `debug`, `build` e `verify`.
|
|
|
|
## Escopo
|
|
|
|
- Preservar corretamente o resultado do processo filho.
|
|
- Melhorar a mensagem de erro quando nao houver codigo numerico.
|
|
- Cobrir o comportamento com testes.
|
|
|
|
## Fora de Escopo
|
|
|
|
- Reestruturar todo o dispatcher.
|
|
- Implementar subcomandos ainda nao existentes.
|
|
- Alterar o protocolo entre CLI e bins filhos.
|
|
|
|
## Abordagem
|
|
|
|
1. Remover `unwrap_or(0)` no ponto de saida.
|
|
2. Tratar dois casos:
|
|
- filho retorna exit code numerico: repassar exatamente;
|
|
- filho termina sem codigo numerico: encerrar com codigo nao-zero e mensagem clara.
|
|
3. Se necessario, extrair a traducao de `ExitStatus` para uma funcao pequena e testavel.
|
|
|
|
## Algoritmo
|
|
|
|
Entrada: `ExitStatus` do processo filho.
|
|
|
|
Passos:
|
|
|
|
1. Chamar `status.code()`.
|
|
2. Se retornar `Some(code)`:
|
|
- encerrar o wrapper com `code`.
|
|
3. Se retornar `None`:
|
|
- escrever mensagem de erro indicando encerramento anormal;
|
|
- encerrar o wrapper com `1`.
|
|
|
|
## Criterios de Aceite
|
|
|
|
- Se o processo filho sair com `0`, o wrapper sai com `0`.
|
|
- Se o processo filho sair com codigo nao-zero, o wrapper replica o mesmo codigo.
|
|
- Se o processo filho terminar sem codigo numerico, o wrapper sai com codigo nao-zero.
|
|
- O comportamento fica coberto por teste unitario.
|
|
|
|
## Tests
|
|
|
|
- Extrair funcao pura ou quase pura para mapear `ExitStatus -> i32` e testá-la.
|
|
- Cobrir:
|
|
- `0`;
|
|
- `1`;
|
|
- outro codigo nao-zero;
|
|
- status sem code numerico quando a plataforma permitir criar esse caso em teste.
|
|
- Se o caso `None` depender de plataforma:
|
|
- encapsular sob `cfg(unix)` ou `cfg(windows)` conforme apropriado;
|
|
- manter ao menos o contrato da funcao testado por unidade.
|
|
- Rodar:
|
|
- `cargo test -p prometeu-cli`
|
|
- `cargo test --workspace`
|
|
|
|
## Risco
|
|
|
|
Muito baixo. A mudanca corrige semantica operacional do CLI e tende a melhorar observabilidade sem alterar a logica de dispatch.
|