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 let snippets = match &doc.snippets {
50 Some(s) if !s.is_empty() => s,
51 _ => {
52 println!("{}", t(Mensagem::NenhumaDocumentacaoEncontrada).yellow());
53 return;
54 }
55 };
56
57 println!("{}", t(Mensagem::TituloDocumentacao).green().bold());
58 println!("{}", "─".repeat(60).dimmed());
59
60 for snippet in snippets {
61 exibir_snippet(snippet);
62 }
63}
64
65fn exibir_snippet(snippet: &DocumentationSnippet) {
69 if let Some(titulo_pagina) = &snippet.page_title {
70 println!("{}", format!("## {}", titulo_pagina).green().bold());
71 }
72
73 if let Some(titulo_codigo) = &snippet.code_title {
74 println!("{}", format!("▸ {}", titulo_codigo).cyan());
75 }
76
77 if let Some(descricao) = &snippet.code_description {
78 println!(" {}", descricao.dimmed().italic());
79 }
80
81 if let Some(blocos) = &snippet.code_list {
82 for bloco in blocos {
83 println!("```{}", bloco.language);
84 println!("{}", bloco.code);
85 println!("```");
86 }
87 }
88
89 if let Some(source) = &snippet.code_id {
90 println!("{}", source.blue().bold().dimmed());
91 }
92
93 println!();
94}
95
96pub fn exibir_chaves_mascaradas(chaves: &[ChaveArmazenada], mascarar: impl Fn(&str) -> String) {
100 println!(
101 "{}",
102 format!("{} {}", chaves.len(), t(Mensagem::ContadorChaves))
103 .green()
104 .bold()
105 );
106 println!("{}", "─".repeat(60).dimmed());
107
108 let rotulo_adicionada = match idioma_atual() {
109 Idioma::English => "added:",
110 Idioma::Portugues => "adicionada:",
111 };
112
113 for (i, chave) in chaves.iter().enumerate() {
114 println!(
115 " {} {} {}",
116 format!("[{}]", i + 1).cyan(),
117 mascarar(&chave.value).bold(),
118 format!("({} {})", rotulo_adicionada, chave.added_at).dimmed()
119 );
120 }
121}
122
123pub fn exibir_nenhuma_chave() {
125 println!("{}", t(Mensagem::NenhumaChaveArmazenada).yellow());
126 println!("{}", t(Mensagem::UsarKeysAdd).cyan());
127}
128
129pub fn exibir_nenhuma_chave_para_remover() {
131 println!("{}", t(Mensagem::NenhumaChaveParaRemover).yellow());
132}
133
134pub fn exibir_indice_invalido(indice: usize, total: usize) {
136 println!(
137 "{}",
138 format!(
139 "{} {} {} {}.",
140 t(Mensagem::IndiceInvalido),
141 indice,
142 "/",
143 total
144 )
145 .red()
146 );
147}
148
149pub fn exibir_chave_adicionada(caminho: &std::path::Path) {
151 println!(
152 "{} {}",
153 t(Mensagem::ChaveAdicionada),
154 caminho.display().to_string().green()
155 );
156}
157
158pub fn exibir_chave_removida(chave_mascarada: &str) {
160 println!(
161 "{} {}",
162 chave_mascarada.bold(),
163 t(Mensagem::ChaveRemovidaSucesso)
164 );
165}
166
167pub fn exibir_operacao_cancelada() {
169 println!("{}", t(Mensagem::OperacaoCancelada).yellow());
170}
171
172pub fn exibir_chaves_removidas() {
174 println!("{}", t(Mensagem::TodasChavesRemovidas).green());
175}
176
177pub fn exibir_xdg_nao_suportado() {
179 println!("{}", t(Mensagem::SistemaXdgNaoSuportado).red());
180}
181
182pub fn exibir_importacao_concluida(importadas: usize, total: usize) {
184 println!(
185 "{}",
186 format!(
187 "{}/{} {}",
188 importadas,
189 total,
190 t(Mensagem::ChavesImportadasSucesso)
191 )
192 .green()
193 );
194}