Skip to main content

eoka_server/
page_context.rs

1use eoka::Page;
2use eoka_protocol::PageContext;
3use std::{fmt::Write, time::Duration};
4
5pub async fn capture(page: &Page) -> Option<PageContext> {
6    let mut context: PageContext = tokio::time::timeout(
7        Duration::from_secs(2),
8        page.evaluate_sync(include_str!("js/page_context.js")),
9    )
10    .await
11    .ok()?
12    .ok()?;
13    context.tab_id = page.target_id().to_owned();
14    Some(context)
15}
16
17pub fn format(context: &PageContext) -> String {
18    let mut text = format!(
19        "URL: {}\nTitle: {}\nDocument: {} (application readiness not inferred)\n",
20        context.url, context.title, context.ready_state
21    );
22    for heading in &context.headings {
23        let _ = writeln!(text, "Heading: {heading}");
24    }
25    for message in &context.messages {
26        let _ = writeln!(text, "Page message: {message}");
27    }
28    if !context.text_excerpt.is_empty() {
29        let _ = writeln!(text, "Page text: {}", context.text_excerpt);
30    }
31    if context.truncated {
32        text.push_str("Page context truncated.\n");
33    }
34    text
35}