Coverage Report

Created: 2026-01-22 08:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wasm-tools/crates/wasm-metadata/src/add_metadata.rs
Line
Count
Source
1
use crate::{Producers, rewrite_wasm};
2
use anyhow::Result;
3
use 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]
11
pub 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
54
impl 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
0
    pub fn to_wasm(&self, input: &[u8]) -> Result<Vec<u8>> {
59
0
        let add_producers = Producers::from_meta(self);
60
0
        rewrite_wasm(self, &add_producers, input)
61
0
    }
62
}
63
64
/// Defines how to modify a field of the component/module metadata
65
#[derive(Debug, Clone)]
66
pub 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
75
impl<T: Debug + Clone> AddMetadataField<T> {
76
    /// Returns true if the field should be cleared
77
0
    pub fn is_clear(&self) -> bool {
78
0
        matches!(self, Self::Clear)
79
0
    }
80
81
    /// Returns true if the field should be kept
82
0
    pub fn is_keep(&self) -> bool {
83
0
        matches!(self, Self::Keep)
84
0
    }
85
}
86
87
impl<T: Debug + Clone> Default for AddMetadataField<T> {
88
4.04k
    fn default() -> Self {
89
4.04k
        Self::Keep
90
4.04k
    }
91
}