use std::collections::HashMap;
#[derive(Debug, Default, Deserialize, Serialize)]
pub struct ManifestSchema1Signed {
#[serde(rename = "schemaVersion")]
schema_version: u16,
pub name: String,
pub tag: String,
pub architecture: String,
#[serde(rename = "fsLayers")]
fs_layers: Vec<S1Layer>,
history: Vec<V1Compat>,
signatures: Vec<Signature>,
}
#[derive(Debug, Default, Deserialize, Serialize)]
struct Signature {
header: serde_json::Value,
signature: String,
protected: String,
}
#[derive(Debug, Deserialize, Serialize)]
struct V1Compat {
#[serde(rename = "v1Compatibility")]
v1_compat: String,
}
#[derive(Debug, Deserialize, Serialize)]
struct S1Layer {
#[serde(rename = "blobSum")]
blob_sum: String,
}
impl ManifestSchema1Signed {
pub fn get_layers(&self) -> Vec<String> {
self.fs_layers
.iter()
.rev()
.map(|l| l.blob_sum.clone())
.collect()
}
pub fn get_labels(&self, layer: usize) -> Option<HashMap<String, String>> {
Some(
serde_json::from_str::<serde_json::Value>(&self.history.get(layer)?.v1_compat)
.ok()?
.get("config")?
.get("Labels")?
.as_object()?
.into_iter()
.filter_map(|(label, value)| Some((label.to_owned(), value.as_str()?.to_owned())))
.collect(),
)
}
}