Skip to main content

sova_devtools/
inject.rs

1//! Inject DevTools markup before `</body>` (via `sova_core::html`).
2
3use sova_core::html::{inject, HtmlAnchor, HtmlInject};
4
5pub const DEVTOOLS_MARKER: &str = "<!-- sova_devtools -->";
6
7/// Insert toolbar + assets. Returns `None` when already present / empty.
8pub fn inject_body(html: &str, fragment: &str) -> Option<String> {
9    inject(
10        html,
11        &HtmlInject::new(HtmlAnchor::BeforeCloseBody, fragment)
12            .marker(DEVTOOLS_MARKER)
13            .skip_if_contains(&["id=\"sova-devtools\""]),
14    )
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn injects_before_body_close() {
23        let html = "<html><body><p>hi</p></body></html>";
24        let out = inject_body(html, "<div id=\"sova-devtools\"></div>").unwrap();
25        assert!(out.contains(DEVTOOLS_MARKER));
26        assert!(out.find("sova-devtools").unwrap() < out.find("</body>").unwrap());
27    }
28
29    #[test]
30    fn idempotent() {
31        let html = format!("<body>{DEVTOOLS_MARKER}</body>");
32        assert!(inject_body(&html, "<div></div>").is_none());
33    }
34}