use bytes::Bytes;
use http::HeaderMap;
use url::Url;
use crate::storage::{session_id_for_url, ArtifactKind, ArtifactMeta, ArtifactRow, PageMetadata};
use crate::Result;
#[async_trait::async_trait]
pub trait ArtifactStorage: Send + Sync {
async fn save_raw(&self, url: &Url, headers: &HeaderMap, body: &Bytes) -> Result<()>;
async fn save_raw_response(
&self,
url: &Url,
_final_url: &Url,
_status: u16,
headers: &HeaderMap,
body: &Bytes,
_truncated: bool,
) -> Result<()> {
self.save_raw(url, headers, body).await
}
async fn save_rendered(&self, url: &Url, html_post_js: &str, meta: &PageMetadata)
-> Result<()>;
async fn save_edge(&self, from: &Url, to: &Url) -> Result<()>;
async fn save_screenshot(&self, url: &Url, png: &[u8]) -> Result<Option<String>> {
let session_id = session_id_for_url(url);
let meta = ArtifactMeta {
url,
final_url: None,
session_id: &session_id,
kind: ArtifactKind::ScreenshotFullPage,
name: None,
step_id: None,
step_kind: None,
selector: None,
mime: None,
};
self.save_artifact(&meta, png).await
}
async fn save_artifact(
&self,
_meta: &ArtifactMeta<'_>,
_bytes: &[u8],
) -> Result<Option<String>> {
Ok(None)
}
async fn list_artifacts(
&self,
_session_id: Option<&str>,
_kind: Option<ArtifactKind>,
) -> Result<Vec<ArtifactRow>> {
Ok(Vec::new())
}
}