browser_panic_hook/mode/
basic.rs1use crate::mode::{PanicDetails, PresentationMode};
2use crate::utils::Unescaped;
3use std::borrow::Cow;
4
5pub 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}