use anyhow::{Context, Result};
use chromiumoxide::Page;
use super::extractors::extract_metadata;
use super::schema::PageMetadata;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PageInfo {
pub title: String,
pub metadata: PageMetadata,
}
pub async fn extract_page_info(page: Page) -> Result<PageInfo> {
let (title, metadata) = tokio::try_join!(
async {
let title_value = page
.evaluate("document.title")
.await
.context("Failed to evaluate document.title")?
.into_value()
.map_err(|e| anyhow::anyhow!("Failed to get page title: {e}"))?;
if let serde_json::Value::String(title) = title_value {
Ok(title)
} else {
Ok(String::new())
}
},
extract_metadata(page.clone()),
)?;
Ok(PageInfo { title, metadata })
}