use sha2::{Digest, Sha256};
use crate::detached::manifest::DetachedManifest;
use crate::provenance::ProvenanceClaim;
use image::GenericImageView;
pub fn create_manifest_from_image(
image_bytes: &[u8],
mut claim: ProvenanceClaim,
) -> Result<DetachedManifest, crate::Error> {
claim = claim.with_instance_digest(image_bytes);
let format = crate::types::ImageOutputFormat::from_magic_bytes(image_bytes)
.map(|f| format!("{:?}", f).to_lowercase())
.unwrap_or_else(|| "unknown".to_string());
let img = crate::util::image::load_image_from_bytes(image_bytes)?;
let (width, height) = img.dimensions();
claim = claim.with_source_facts(&format, width, height, image_bytes.len() as u64);
Ok(DetachedManifest::new(claim))
}
pub fn create_manifest_with_claim(
image_bytes: &[u8],
claim: ProvenanceClaim,
) -> Result<DetachedManifest, crate::Error> {
let mut claim = claim.with_instance_digest(image_bytes);
let format = crate::types::ImageOutputFormat::from_magic_bytes(image_bytes)
.map(|f| format!("{:?}", f).to_lowercase())
.unwrap_or_else(|| "unknown".to_string());
let img = crate::util::image::load_image_from_bytes(image_bytes)?;
let (width, height) = img.dimensions();
claim = claim.with_source_facts(&format, width, height, image_bytes.len() as u64);
Ok(DetachedManifest::new(claim))
}
#[must_use]
pub fn compute_image_digest(image_bytes: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(image_bytes);
format!("sha256:{}", hex::encode(hasher.finalize()))
}