browser_panic_hook/
utils.rs1use std::fmt::{Display, Formatter};
2use std::panic::PanicInfo;
3
4pub fn extract_message(info: &PanicInfo) -> String {
14 let display = info.to_string();
16
17 let s = match display.strip_prefix("panicked at '") {
19 Some(s) => s,
20 None => return display,
21 };
22
23 let s = match s.rsplit_once('\'') {
25 Some((s, _)) => s,
26 None => return display,
27 };
28
29 s.to_string()
32}
33
34pub fn escape_text(text: &str) -> String {
35 text.replace('&', "&")
36 .replace('<', "<")
37 .replace('>', ">")
38 .replace('\'', "'")
39 .replace('"', """)
40}
41
42pub enum Unescaped {
43 Unsafe(String),
44 Safe(String),
45}
46
47impl Unescaped {
48 pub fn safe(s: impl Into<String>) -> Self {
49 Unescaped::Safe(s.into())
50 }
51}
52
53impl From<String> for Unescaped {
54 fn from(value: String) -> Self {
55 Self::Unsafe(value)
56 }
57}
58
59impl Display for Unescaped {
60 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
61 match self {
62 Self::Unsafe(s) => f.write_str(&escape_text(&s)),
63 Self::Safe(s) => f.write_str(s),
64 }
65 }
66}