use crate::{sprint, sprintln};
use ansi_term::Style;
use chrono::{DateTime, NaiveDateTime};
pub fn opt(opt: &Option<String>) -> &str {
opt.as_ref().map(String::as_ref).unwrap_or("None")
}
pub fn date(date: i64) -> String {
let date = NaiveDateTime::from_timestamp(date, 0);
let date = DateTime::<chrono::Utc>::from_utc(date, chrono::Utc);
date.to_rfc2822()
}
pub fn print_indent<S: AsRef<str>>(
color: Style,
start: usize,
indent: usize,
cols: Option<usize>,
sep: &str,
value: impl IntoIterator<Item = S>,
) {
let v = value.into_iter();
match cols {
Some(cols) if cols > indent + 2 => {
let mut pos = start;
let mut iter = v.peekable();
if let Some(word) = iter.next() {
sprint!("{}", color.paint(word.as_ref()));
pos += word.as_ref().len();
}
if iter.peek().is_some() && pos + sep.len() < cols {
sprint!("{}", sep);
pos += sep.len();
}
while let Some(word) = iter.next() {
let word = word.as_ref();
if pos + word.len() > cols {
sprint!("\n{:>padding$}", "", padding = indent);
pos = indent;
}
sprint!("{}", color.paint(word));
pos += word.len();
if iter.peek().is_some() && pos + sep.len() < cols {
sprint!("{}", sep);
pos += sep.len();
}
}
}
_ => {
let mut iter = v;
if let Some(word) = iter.next() {
sprint!("{}", color.paint(word.as_ref()));
}
for word in iter {
sprint!("{}{}", sep, color.paint(word.as_ref()));
}
}
}
sprintln!();
}
use ansi_term::Color;
pub fn color_repo(name: &str) -> String {
let mut col: u32 = 5;
for &b in name.as_bytes() {
col = (b as u32).wrapping_add(((col as u32) << 4).wrapping_add(col as u32));
}
col = (col % 6) + 9;
let col = Style::from(Color::Fixed(col as u8)).bold();
col.paint(name).to_string()
}