1use alloc::string::String;
4use alloc::vec::Vec;
5
6use semver::Version;
7
8#[cfg(feature = "schemars")]
9use schemars::JsonSchema;
10#[cfg(feature = "serde")]
11use serde::{Deserialize, Serialize};
12#[cfg(feature = "serde")]
13use serde_with::serde_as;
14
15#[cfg_attr(feature = "serde", serde_as)]
17#[derive(Clone, Debug, PartialEq, Eq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19#[cfg_attr(feature = "schemars", derive(JsonSchema))]
20pub struct PackRef {
21 pub oci_url: String,
23 #[cfg_attr(
25 feature = "serde",
26 serde_as(as = "serde_with::formats::DisplayFromStr")
27 )]
28 #[cfg_attr(
29 feature = "schemars",
30 schemars(with = "String", description = "SemVer version")
31 )]
32 pub version: Version,
33 pub digest: String,
35 #[cfg_attr(
37 feature = "serde",
38 serde(default, skip_serializing_if = "Vec::is_empty")
39 )]
40 pub signatures: Vec<Signature>,
41}
42
43impl PackRef {
44 pub fn new(oci_url: impl Into<String>, version: Version, digest: impl Into<String>) -> Self {
46 Self {
47 oci_url: oci_url.into(),
48 version,
49 digest: digest.into(),
50 signatures: Vec::new(),
51 }
52 }
53}
54
55#[cfg_attr(feature = "serde", serde_as)]
57#[derive(Clone, Debug, PartialEq, Eq)]
58#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59#[cfg_attr(feature = "schemars", derive(JsonSchema))]
60pub struct Signature {
61 pub key_id: String,
63 pub algorithm: SignatureAlgorithm,
65 #[cfg_attr(feature = "serde", serde_as(as = "serde_with::base64::Base64"))]
67 pub signature: Vec<u8>,
68}
69
70impl Signature {
71 pub fn new(
73 key_id: impl Into<String>,
74 algorithm: SignatureAlgorithm,
75 signature: Vec<u8>,
76 ) -> Self {
77 Self {
78 key_id: key_id.into(),
79 algorithm,
80 signature,
81 }
82 }
83}
84
85#[derive(Clone, Debug, PartialEq, Eq, Hash)]
87#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88#[cfg_attr(feature = "schemars", derive(JsonSchema))]
89#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
90pub enum SignatureAlgorithm {
91 Ed25519,
93 Other(String),
95}