use lazy_static::lazy_static; use regex::Regex; use super::ast::DiscordComponent; pub fn parse_link(text: &'_ str) -> Option<(DiscordComponent<'_>, usize)> { lazy_static! { static ref LINK: Regex = Regex::new(r#"^((?:https?|steam)://[^\s<]+[^<.,:;"'\]\s])"#).unwrap(); } if let Some(caps) = LINK.captures(text) { let mut link_range = caps.get(0).unwrap().range(); let orig_link = &text[link_range.clone()]; if orig_link.ends_with(')') { let mut bracket_balance: i16 = 0; for c in orig_link.chars() { if c == '(' { bracket_balance -= 1; } else if c == ')' { bracket_balance += 1; } } if bracket_balance > 0 { link_range = link_range.start..(link_range.end - 1); } } let link = &text[link_range]; return Some((DiscordComponent::Link(link), link.len())); } // TODO(Charlotte): Parse links None }