browser_panic_hook/mode/
basic.rs

1use crate::mode::{PanicDetails, PresentationMode};
2use crate::utils::Unescaped;
3use std::borrow::Cow;
4
5/// Replace the body with a simple panic information representation.
6pub struct Basic;
7
8impl PresentationMode for Basic {
9    fn present(&self, details: PanicDetails) -> Result<(), Cow<'static, str>> {
10        super::set_body(Some("panicked"), build_content(details))
11    }
12}
13
14fn build_content(details: PanicDetails) -> String {
15    let message = details.message();
16    let internals = Unescaped::from(format!("{info}\n\n\n{info:#?}", info = &details.0));
17    let location = details
18        .location()
19        .unwrap_or_else(|| Unescaped::safe("<i>Unknown</i>"));
20
21    format!(
22        r#"
23<main class="panicked__main">
24<h1 class="panicked__title">Application panicked!</h1>
25
26<dl class="panicked__overview">
27    <dt class="panicked__overview__reason">Reason</dt><dd class="panicked__overview__reason">{message}</dd>
28    <dt class="panicked__overview__location">Location</dt><dd class="panicked__overview__location">{location}</dd>
29</dl>
30
31<details class="panicked__details">
32    <summary>Internal Details</summary>
33    <pre>{internals}</pre>
34</details>
35
36</main>
37    "#,
38    )
39}