// yt - A fully featured command line YouTube client // // Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de> // SPDX-License-Identifier: GPL-3.0-or-later // // This file is part of Yt. // // You should have received a copy of the License along with this program. // If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. use std::fmt::Write; use chrono::{Local, TimeZone}; use chrono_humanize::{Accuracy, HumanTime, Tense}; use crate::comments::comment::CommentExt; use super::comment::Comments; impl Comments { pub fn render(&self, color: bool) -> String { self.render_help(color).expect("This should never fail.") } fn render_help(&self, color: bool) -> Result<String, std::fmt::Error> { let mut f = String::new(); macro_rules! c { ($color_str:expr, $write:ident, $color:expr) => { if $color { $write.write_str(concat!("\x1b[", $color_str, "m"))? } }; } fn format( comment: &CommentExt, f: &mut String, ident_count: u32, color: bool, ) -> std::fmt::Result { let ident = &(0..ident_count).map(|_| " ").collect::<String>(); let value = &comment.value; f.write_str(ident)?; if value.author_is_uploader { c!("91;1", f, color); } else { c!("35", f, color); } f.write_str(&value.author)?; c!("0", f, color); if value.edited || value.is_favorited { f.write_str("[")?; if value.edited { f.write_str("")?; } if value.edited && value.is_favorited { f.write_str(" ")?; } if value.is_favorited { f.write_str("")?; } f.write_str("]")?; } c!("36;1", f, color); write!( f, " {}", HumanTime::from( Local .timestamp_opt(value.timestamp, 0) .single() .expect("This should be valid") ) .to_text_en(Accuracy::Rough, Tense::Past) )?; c!("0", f, color); // c!("31;1", f); // f.write_fmt(format_args!(" [{}]", comment.value.like_count))?; // c!("0", f); f.write_str(":\n")?; f.write_str(ident)?; f.write_str(&value.text.replace('\n', &format!("\n{}", ident)))?; f.write_str("\n")?; if !comment.replies.is_empty() { let mut children = comment.replies.clone(); children.sort_by(|a, b| a.value.timestamp.cmp(&b.value.timestamp)); for child in children { format(&child, f, ident_count + 4, color)?; } } else { f.write_str("\n")?; } Ok(()) } if !&self.vec.is_empty() { let mut children = self.vec.clone(); children.sort_by(|a, b| b.value.like_count.cmp(&a.value.like_count)); for child in children { format(&child, &mut f, 0, color)? } } Ok(f) } }