1use colored::Colorize;
7
8use crate::api::{DocumentationSnippet, LibrarySearchResult, RespostaDocumentacao};
9use crate::i18n::{idioma_atual, t, Idioma, Mensagem};
10use crate::storage::ChaveArmazenada;
11
12pub fn exibir_bibliotecas_formatado(resultados: &[LibrarySearchResult]) {
19 if resultados.is_empty() {
20 println!("{}", t(Mensagem::NenhumaBibliotecaEncontrada).yellow());
21 return;
22 }
23
24 println!("{}", t(Mensagem::BibliotecasEncontradas).green().bold());
25 println!("{}", "─".repeat(60).dimmed());
26
27 for (i, lib) in resultados.iter().enumerate() {
28 let numero = format!("{}.", i + 1);
29 println!("{} {} {}", numero.cyan(), lib.id.bold(), lib.title.dimmed());
30
31 if let Some(desc) = &lib.description {
32 println!(" {}", desc.italic());
33 }
34
35 if let Some(score) = lib.trust_score {
36 println!(" {} {:.1}", t(Mensagem::ConfiancaScore).dimmed(), score);
37 }
38
39 println!();
40 }
41}
42
43pub fn exibir_documentacao_formatada(doc: &RespostaDocumentacao) {
49 if let Some(snippets) = &doc.snippets {
50 if snippets.is_empty() {
51 println!("{}", t(Mensagem::NenhumaDocumentacaoEncontrada).yellow());
52 return;
53 }
54
55 println!("{}", t(Mensagem::TituloDocumentacao).green().bold());
56 println!("{}", "─".repeat(60).dimmed());
57
58 for snippet in snippets {
59 exibir_snippet(snippet);
60 }
61 } else if let Some(conteudo) = &doc.content {
62 println!("{}", conteudo);
63 } else {
64 println!("{}", t(Mensagem::SemConteudoDisponivel).yellow());
65 }
66}
67
68fn exibir_snippet(snippet: &DocumentationSnippet) {
70 println!("{}", snippet.content);
71
72 if let Some(urls) = &snippet.source_urls {
73 println!("\n{}", t(Mensagem::TituloFontes).dimmed());
74 for url in urls {
75 println!(" {}", url.blue().bold());
76 }
77 }
78
79 println!();
80}
81
82pub fn exibir_chaves_mascaradas(chaves: &[ChaveArmazenada], mascarar: impl Fn(&str) -> String) {
86 println!(
87 "{}",
88 format!("{} {}", chaves.len(), t(Mensagem::ContadorChaves))
89 .green()
90 .bold()
91 );
92 println!("{}", "─".repeat(60).dimmed());
93
94 let rotulo_adicionada = match idioma_atual() {
95 Idioma::English => "added:",
96 Idioma::Portugues => "adicionada:",
97 };
98
99 for (i, chave) in chaves.iter().enumerate() {
100 println!(
101 " {} {} {}",
102 format!("[{}]", i + 1).cyan(),
103 mascarar(&chave.value).bold(),
104 format!("({} {})", rotulo_adicionada, chave.added_at).dimmed()
105 );
106 }
107}
108
109pub fn exibir_nenhuma_chave() {
111 println!("{}", t(Mensagem::NenhumaChaveArmazenada).yellow());
112 println!("{}", t(Mensagem::UsarKeysAdd).cyan());
113}
114
115pub fn exibir_nenhuma_chave_para_remover() {
117 println!("{}", t(Mensagem::NenhumaChaveParaRemover).yellow());
118}
119
120pub fn exibir_indice_invalido(indice: usize, total: usize) {
122 println!(
123 "{}",
124 format!(
125 "{} {} {} {}.",
126 t(Mensagem::IndiceInvalido),
127 indice,
128 "/",
129 total
130 )
131 .red()
132 );
133}
134
135pub fn exibir_chave_adicionada(caminho: &std::path::Path) {
137 println!(
138 "{} {}",
139 t(Mensagem::ChaveAdicionada),
140 caminho.display().to_string().green()
141 );
142}
143
144pub fn exibir_chave_removida(chave_mascarada: &str) {
146 println!(
147 "{} {}",
148 chave_mascarada.bold(),
149 t(Mensagem::ChaveRemovidaSucesso)
150 );
151}
152
153pub fn exibir_operacao_cancelada() {
155 println!("{}", t(Mensagem::OperacaoCancelada).yellow());
156}
157
158pub fn exibir_chaves_removidas() {
160 println!("{}", t(Mensagem::TodasChavesRemovidas).green());
161}
162
163pub fn exibir_xdg_nao_suportado() {
165 println!("{}", t(Mensagem::SistemaXdgNaoSuportado).red());
166}
167
168pub fn exibir_importacao_concluida(importadas: usize, total: usize) {
170 println!(
171 "{}",
172 format!(
173 "{}/{} {}",
174 importadas,
175 total,
176 t(Mensagem::ChavesImportadasSucesso)
177 )
178 .green()
179 );
180}