use std::sync::Arc;
use crate::error::Result;
use crate::http::HttpClient;
use crate::resources::{
auth::AuthResource,
billing::BillingResource,
integrations::IntegrationsResource,
jobs::JobsResource,
monitors::MonitorsResource,
screenshots::{wait_for_job, ScreenshotsResource, WaitOptions},
workspaces::WorkspacesResource,
};
use crate::types::{HealthResponse, JobResult, WebScreenshotOptions};
#[derive(Clone)]
pub struct ScreenshotFreeAPIClient {
http: Arc<HttpClient>,
pub auth: AuthResource,
pub screenshots: ScreenshotsResource,
pub jobs: JobsResource,
pub billing: BillingResource,
pub workspaces: WorkspacesResource,
pub monitors: MonitorsResource,
pub integrations: IntegrationsResource,
}
impl ScreenshotFreeAPIClient {
pub fn new(api_key: impl Into<String>) -> Self {
Self::with_base_url(api_key, "https://api.screenshotfreeapi.com")
}
pub fn with_base_url(
api_key: impl Into<String>,
base_url: impl Into<String>,
) -> Self {
let http = Arc::new(HttpClient::new(api_key.into(), base_url.into()));
Self {
auth: AuthResource { http: Arc::clone(&http) },
screenshots: ScreenshotsResource { http: Arc::clone(&http) },
jobs: JobsResource { http: Arc::clone(&http) },
billing: BillingResource { http: Arc::clone(&http) },
workspaces: WorkspacesResource { http: Arc::clone(&http) },
monitors: MonitorsResource { http: Arc::clone(&http) },
integrations: IntegrationsResource { http: Arc::clone(&http) },
http,
}
}
pub async fn capture(&self, url: &str) -> Result<JobResult> {
let enq = self
.screenshots
.capture_web(WebScreenshotOptions {
url: url.to_string(),
..Default::default()
})
.await?;
wait_for_job(&self.http, &enq.job_id, WaitOptions::default()).await
}
pub async fn health(&self) -> Result<HealthResponse> {
self.http.get("/health", None).await
}
}