Framework CLI para C++: cppcli — criação de aplicações de console poderosas
O desenvolvimento de interfaces de console (CLI) em C++ frequentemente requer análise manual de argumentos, processamento de flags e organização de comandos. A biblioteca cppcli fornece um framework pronto para a criação rápida de aplicações CLI profissionais. Ela permite que você se concentre na lógica de negócios, e não na infraestrutura de entrada/saída. Neste artigo, vamos explorar os principais recursos do cppcli, fornecer exemplos de código e mostrar como integrá-lo ao seu projeto.
Principais recursos do cppcli
- Definição declarativa de comandos — cada comando é descrito como uma classe separada ou função lambda.
- Análise automática de argumentos — suporte para argumentos posicionais, nomeados e flags.
- Saída colorida e formatação — utilitários integrados para saída estilizada (cores ANSI, tabelas, barras de progresso).
- Validação e ajuda — geração automática de mensagens de ajuda e verificação de argumentos obrigatórios.
- Extensibilidade — suporte para tipos de argumentos personalizados e middleware.
Início rápido: instalação e primeiro exemplo
O cppcli é distribuído como uma biblioteca header-only. Para instalar, clone o repositório ou use CMake FetchContent. Inclusão no projeto:
#include <cppcli/cli.h>#include <iostream>
int main(int argc, char* argv[]) { cppcli::App app("Minha aplicação", "1.0.0"); app.run(argc, argv); return 0;}Esta é a estrutura mínima. Agora vamos adicionar o comando greet, que recebe o nome do usuário.
Exemplo: comando com argumentos
#include <cppcli/cli.h>
int main(int argc, char* argv[]) { cppcli::App app("Greeter", "1.0.0");
app.command("greet", "Sauda o usuário") .argument<std::string>("name", "Nome do usuário") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); std::cout << "Olá, " << name << "!"; });
app.run(argc, argv); return 0;}Execução: ./app greet João exibirá Olá, João!. Se o argumento não for fornecido, o cppcli exibirá um erro e a ajuda.
Flags e parâmetros opcionais
Vamos adicionar a flag --formal para uma saudação formal:
app.command("greet", "Sauda o usuário") .argument<std::string>("name", "Nome") .flag("--formal", "-f", "Saudação formal") .action([](const cppcli::Args& args) { std::string name = args.get<std::string>("name"); bool formal = args.get<bool>("formal"); if (formal) std::cout << "Olá, " << name << "!"; else std::cout << "Oi, " << name << "!"; });Agora ./app greet João --formal exibirá Olá, João!.
Comandos aninhados e subcomandos
O cppcli suporta uma estrutura de comandos em árvore. Por exemplo, para um utilitário de gerenciamento de projetos:
app.command("project", "Gerenciamento de projetos") .command("create", "Criar projeto") .argument<std::string>("name", "Nome do projeto") .action([](const cppcli::Args& args) { std::cout << "Projeto criado: " << args.get<std::string>("name") << ""; }) .command("delete", "Excluir projeto") .argument<std::string>("name", "Nome do projeto") .flag("--force", "Sem confirmação") .action([](const cppcli::Args& args) { // lógica de exclusão });Chamada: ./app project
Também na biblioteca
Cache em C++: Biblioteca Cache++
Processamento de Imagens em Java: Bibliotecas e Exemplos de Código
Tokens JWT em Swift: guia completo para trabalhar com JSON Web Tokens
Event Bus e o padrão Observer em Java: implementação de arquitetura fracamente acoplada
Autorização e Autenticação em C++: bibliotecas e implementação