/
codenik
/
codenik-tools
Обзор
Документация
Войти
/
codenik
/
codenik-tools
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
crates/codenik-cli/src/output.rs
115 строк
3 KB
Codenik Wizard
feat(cli): wire mrs list and show for git providers
09 май 2026, 00:50
09 май 2026, 00:50
6b5cb00
Код
Авторство
О чём код?
//! Простые форматтеры вывода для CLI. use codenik_core::{Issue, IssueState, MergeRequest, MergeRequestState, Repo}; pub fn print_repos(repos: &[Repo]) { if repos.is_empty() { println!("(репозиториев не найдено)"); return; } for r in repos { let visibility = if r.is_private { "private" } else { "public " }; let desc = r.description.as_deref().unwrap_or("").trim(); let suffix = if desc.is_empty() { String::new() } else { format!(" — {desc}") }; println!("{visibility} {full}{suffix}", full = r.full_name); } } pub fn print_issues(issues: &[Issue]) { if issues.is_empty() { println!("(задач не найдено)"); return; } for i in issues { let state = match i.state { IssueState::Open => "open ", IssueState::Closed => "closed", IssueState::Other => "other ", }; println!( "{state} {scope}#{id} {title}", scope = i.key.scope, id = i.key.id, title = i.title ); } } pub fn print_merge_requests(mrs: &[MergeRequest]) { if mrs.is_empty() { println!("(MR / PR не найдено)"); return; } for m in mrs { let state = match m.state { MergeRequestState::Open => "open ", MergeRequestState::Closed => "closed", MergeRequestState::Merged => "merged", MergeRequestState::Other => "other ", }; println!( "{state} {scope}#{id} {src} → {dst} {title}", scope = m.key.scope, id = m.key.id, src = m.source_branch, dst = m.target_branch, title = m.title ); } } pub fn print_merge_request_details(m: &MergeRequest) { let state = match m.state { MergeRequestState::Open => "open", MergeRequestState::Closed => "closed", MergeRequestState::Merged => "merged", MergeRequestState::Other => "other", }; println!("Key: {}#{}", m.key.scope, m.key.id); println!("Title: {}", m.title); println!("State: {state}"); println!("Source: {}", m.source_branch); println!("Target: {}", m.target_branch); if let Some(author) = &m.author { println!("Author: {}", author.login); } if let Some(url) = &m.html_url { println!("URL: {url}"); } if let Some(body) = &m.body { if !body.is_empty() { println!(); println!("{body}"); } } } pub fn print_issue_details(i: &Issue) { let state = match i.state { IssueState::Open => "open", IssueState::Closed => "closed", IssueState::Other => "other", }; println!("Key: {}#{}", i.key.scope, i.key.id); println!("Title: {}", i.title); println!("State: {state}"); if let Some(author) = &i.author { println!("Author: {}", author.login); } if !i.labels.is_empty() { println!("Labels: {}", i.labels.join(", ")); } if let Some(url) = &i.html_url { println!("URL: {url}"); } if let Some(body) = &i.body { if !body.is_empty() { println!(); println!("{body}"); } } }