use std::collections::BTreeMap;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct ScrapeResult {
#[serde(default)]
pub uuid: String,
#[serde(default)]
pub config: serde_json::Value,
#[serde(default)]
pub context: serde_json::Value,
pub result: ResultData,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ResultData {
#[serde(default)]
pub content: String,
#[serde(default)]
pub content_encoding: String,
#[serde(default)]
pub content_type: String,
#[serde(default)]
pub url: String,
#[serde(default, deserialize_with = "null_as_zero_u16")]
pub status_code: u16,
#[serde(default)]
pub status: String,
#[serde(default)]
pub success: bool,
#[serde(default)]
pub duration: f64,
#[serde(default)]
pub format: String,
#[serde(default)]
pub error: Option<ScrapeErrorDetails>,
#[serde(default)]
pub log_url: String,
#[serde(default)]
pub response_headers: serde_json::Value,
#[serde(default)]
pub request_headers: BTreeMap<String, String>,
#[serde(default)]
pub screenshots: BTreeMap<String, serde_json::Value>,
#[serde(default)]
pub extracted_data: Option<serde_json::Value>,
#[serde(default)]
pub browser_data: serde_json::Value,
#[serde(default)]
pub iframes: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ScrapeErrorDetails {
#[serde(default)]
pub code: String,
#[serde(default, deserialize_with = "null_as_zero_u16")]
pub http_code: u16,
#[serde(default)]
pub message: String,
#[serde(default)]
pub doc_url: String,
#[serde(default)]
pub retryable: bool,
}
fn null_as_zero_u16<'de, D>(deserializer: D) -> Result<u16, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(Option::<u16>::deserialize(deserializer)?.unwrap_or(0))
}