/// TODO: handle name collisions better #[crate::export(object, js_name = "NoteLikeForGetNoteSummary")] pub struct NoteLike { pub file_ids: Vec, pub text: Option, pub cw: Option, pub has_poll: bool, } #[crate::export] pub fn get_note_summary(note: NoteLike) -> String { let mut buf: Vec = vec![]; if let Some(cw) = note.cw { buf.push(cw) } else if let Some(text) = note.text { buf.push(text) } match note.file_ids.len() { 0 => (), 1 => buf.push("📎".to_string()), n => buf.push(format!("📎 ({})", n)), }; if note.has_poll { buf.push("📊".to_string()) } buf.join(" ") } #[cfg(test)] mod unit_test { use super::{get_note_summary, NoteLike}; use pretty_assertions::assert_eq; #[test] fn test_note_summary() { let note = NoteLike { file_ids: vec![], text: Some("Hello world!".to_string()), cw: None, has_poll: false, }; assert_eq!(get_note_summary(note), "Hello world!"); let note_with_cw = NoteLike { file_ids: vec![], text: Some("Hello world!".to_string()), cw: Some("Content warning".to_string()), has_poll: false, }; assert_eq!(get_note_summary(note_with_cw), "Content warning"); let note_with_file_and_cw = NoteLike { file_ids: vec!["9s7fmcqogiq4igin".to_string()], text: None, cw: Some("Selfie, no ec".to_string()), has_poll: false, }; assert_eq!(get_note_summary(note_with_file_and_cw), "Selfie, no ec 📎"); let note_with_files_only = NoteLike { file_ids: vec![ "9s7fmcqogiq4igin".to_string(), "9s7qrld5u14cey98".to_string(), "9s7gebs5zgts4kca".to_string(), "9s5z3e4vefqd29ee".to_string(), ], text: None, cw: None, has_poll: false, }; assert_eq!(get_note_summary(note_with_files_only), "📎 (4)"); let note_all = NoteLike { file_ids: vec![ "9s7fmcqogiq4igin".to_string(), "9s7qrld5u14cey98".to_string(), "9s7gebs5zgts4kca".to_string(), "9s5z3e4vefqd29ee".to_string(), ], text: Some("Hello world!".to_string()), cw: Some("Content warning".to_string()), has_poll: true, }; assert_eq!(get_note_summary(note_all), "Content warning 📎 (4) 📊"); } }