Skip to main content

scrapfly_sdk/result/
screenshot.rs

1//! Screenshot result — port of `sdk/go/result_screenshot.go`.
2
3use std::path::{Path, PathBuf};
4
5use bytes::Bytes;
6
7/// Result of a screenshot API call.
8#[derive(Debug, Clone)]
9pub struct ScreenshotResult {
10    /// Raw image bytes.
11    pub image: Bytes,
12    /// Image metadata.
13    pub metadata: ScreenshotMetadata,
14}
15
16/// Screenshot metadata parsed from the response headers.
17#[derive(Debug, Clone, Default)]
18pub struct ScreenshotMetadata {
19    /// File extension inferred from Content-Type (`png`, `jpeg`, …).
20    pub extension_name: String,
21    /// Upstream HTTP status code, from the `x-scrapfly-upstream-http-code` header.
22    pub upstream_status_code: u16,
23    /// Final upstream URL, from the `x-scrapfly-upstream-url` header.
24    pub upstream_url: String,
25}
26
27impl ScreenshotResult {
28    /// Save the image to disk at `{dir}/{name}.{extension}`. Creates `dir`
29    /// (and parents) best-effort. Returns the written path.
30    pub fn save(&self, name: &str, dir: Option<&Path>) -> std::io::Result<PathBuf> {
31        let dir = dir.unwrap_or_else(|| Path::new("."));
32        std::fs::create_dir_all(dir)?;
33        let ext = if self.metadata.extension_name.is_empty() {
34            "bin"
35        } else {
36            &self.metadata.extension_name
37        };
38        let path = dir.join(format!("{}.{}", name, ext));
39        std::fs::write(&path, &self.image)?;
40        Ok(path)
41    }
42}