wasm_metadata/
add_metadata.rs

1use crate::{Producers, rewrite_wasm};
2use anyhow::Result;
3use std::fmt::Debug;
4
5/// Add metadata (module name, producers) to a WebAssembly file.
6///
7/// Supports both core WebAssembly modules and components. In components,
8/// metadata will be added to the outermost component.
9#[derive(Debug, Clone, Default)]
10#[non_exhaustive]
11pub struct AddMetadata {
12    /// Add a module or component name to the names section
13    pub name: AddMetadataField<String>,
14
15    /// Add a programming language to the producers section
16    pub language: Vec<(String, String)>,
17
18    /// Add a tool and its version to the producers section
19    pub processed_by: Vec<(String, String)>,
20
21    /// Add an SDK and its version to the producers section
22    pub sdk: Vec<(String, String)>,
23
24    /// Contact details of the people or organization responsible,
25    /// encoded as a freeform string.
26    #[cfg(feature = "oci")]
27    pub authors: AddMetadataField<crate::Authors>,
28
29    /// A human-readable description of the binary
30    #[cfg(feature = "oci")]
31    pub description: AddMetadataField<crate::Description>,
32
33    /// License(s) under which contained software is distributed as an SPDX License Expression.
34    #[cfg(feature = "oci")]
35    pub licenses: AddMetadataField<crate::Licenses>,
36
37    /// URL to get source code for building the image
38    #[cfg(feature = "oci")]
39    pub source: AddMetadataField<crate::Source>,
40
41    /// URL to find more information on the binary
42    #[cfg(feature = "oci")]
43    pub homepage: AddMetadataField<crate::Homepage>,
44
45    /// Source control revision identifier for the packaged software.
46    #[cfg(feature = "oci")]
47    pub revision: AddMetadataField<crate::Revision>,
48
49    /// Version of the packaged software
50    #[cfg(feature = "oci")]
51    pub version: AddMetadataField<crate::Version>,
52}
53
54impl AddMetadata {
55    /// Process a WebAssembly binary. Supports both core WebAssembly modules, and WebAssembly
56    /// components. The module and component will have, at very least, an empty name and producers
57    /// section created.
58    pub fn to_wasm(&self, input: &[u8]) -> Result<Vec<u8>> {
59        let add_producers = Producers::from_meta(self);
60        rewrite_wasm(self, &add_producers, input)
61    }
62}
63
64/// Defines how to modify a field of the component/module metadata
65#[derive(Debug, Clone)]
66pub enum AddMetadataField<T: Debug + Clone> {
67    /// Keep the existing value of the field
68    Keep,
69    /// Remove the existing value of the field
70    Clear,
71    /// Set the field to a new value
72    Set(T),
73}
74
75impl<T: Debug + Clone> AddMetadataField<T> {
76    /// Returns true if the field should be cleared
77    pub fn is_clear(&self) -> bool {
78        matches!(self, Self::Clear)
79    }
80
81    /// Returns true if the field should be kept
82    pub fn is_keep(&self) -> bool {
83        matches!(self, Self::Keep)
84    }
85}
86
87impl<T: Debug + Clone> Default for AddMetadataField<T> {
88    fn default() -> Self {
89        Self::Keep
90    }
91}