docker_registry/v2/manifest/
manifest_schema1.rs1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Default, Deserialize, Serialize)]
9pub struct ManifestSchema1Signed {
10 #[serde(rename = "schemaVersion")]
11 schema_version: u16,
12 pub name: String,
13 pub tag: String,
14 pub architecture: String,
15 #[serde(rename = "fsLayers")]
16 fs_layers: Vec<S1Layer>,
17 history: Vec<V1Compat>,
18 signatures: Vec<Signature>,
19}
20
21#[derive(Debug, Default, Deserialize, Serialize)]
22struct Signature {
23 header: serde_json::Value,
26 signature: String,
27 protected: String,
28}
29
30#[derive(Debug, Deserialize, Serialize)]
32struct V1Compat {
33 #[serde(rename = "v1Compatibility")]
34 v1_compat: String,
35}
36
37#[derive(Debug, Deserialize, Serialize)]
38struct S1Layer {
39 #[serde(rename = "blobSum")]
40 blob_sum: String,
41}
42
43impl ManifestSchema1Signed {
44 pub fn get_layers(&self) -> Vec<String> {
48 self.fs_layers.iter().rev().map(|l| l.blob_sum.clone()).collect()
49 }
50
51 pub fn get_labels(&self, layer: usize) -> Option<HashMap<String, String>> {
55 Some(
56 serde_json::from_str::<serde_json::Value>(&self.history.get(layer)?.v1_compat)
57 .ok()?
58 .get("config")?
59 .get("Labels")?
60 .as_object()?
61 .into_iter()
62 .filter_map(|(label, value)| Some((label.to_owned(), value.as_str()?.to_owned())))
63 .collect(),
64 )
65 }
66}