f5ed284f8c 2025-06-21 arcade: use crate::Cursor;
f5ed284f8c 2025-06-21 arcade:
f5ed284f8c 2025-06-21 arcade: use lazy_static::lazy_static;
f5ed284f8c 2025-06-21 arcade: use regex::Regex;
0f47e23e21 2026-01-12 arcade: use scraper::Html;
0f47e23e21 2026-01-12 arcade: use stacked_errors::{
0f47e23e21 2026-01-12 arcade: bail,
0f47e23e21 2026-01-12 arcade: Result,
0f47e23e21 2026-01-12 arcade: };
f5ed284f8c 2025-06-21 arcade:
f5ed284f8c 2025-06-21 arcade: lazy_static! {
f5ed284f8c 2025-06-21 arcade: pub static ref RE_DOMAIN: Regex = Regex::new(r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$").unwrap();
f5ed284f8c 2025-06-21 arcade: }
f5ed284f8c 2025-06-21 arcade:
f5ed284f8c 2025-06-21 arcade: /// `Attachment` object to store number attachment data and corresponding file name
f5ed284f8c 2025-06-21 arcade: #[derive(Debug)]
f5ed284f8c 2025-06-21 arcade: pub struct Attachment {
f5ed284f8c 2025-06-21 arcade: pub data: Cursor<Vec<u8>>,
f5ed284f8c 2025-06-21 arcade: pub name: String,
0f47e23e21 2026-01-12 arcade: }
0f47e23e21 2026-01-12 arcade:
0f47e23e21 2026-01-12 arcade: /// Pass any text here to be validated as HTML, breaks on validation errors
0f47e23e21 2026-01-12 arcade: pub fn validate (text: &str) -> Result<&str> {
6ce625a569 2026-01-12 arcade: // Technically full validation is not needed nor required here, all text after validation
6ce625a569 2026-01-12 arcade: // is used in Telegram messages as RAW text enclosed in `pre`/`code` tags, so the only reason
6ce625a569 2026-01-12 arcade: // for this check is to make sure there's no dangling closing tags in the text that might
6ce625a569 2026-01-12 arcade: // break Telegram message formatting
0f47e23e21 2026-01-12 arcade: let fragment = Html::parse_fragment(text);
0f47e23e21 2026-01-12 arcade: if !fragment.errors.is_empty() {
0f47e23e21 2026-01-12 arcade: bail!(fragment.errors.join("\n"));
0f47e23e21 2026-01-12 arcade: }
c996f5c871 2026-01-12 arcade: Ok(text)
f5ed284f8c 2025-06-21 arcade: }