uv_distribution_types/
build_info.rs

1use uv_cache_key::{CacheKey, CacheKeyHasher, cache_digest};
2
3use crate::{BuildVariables, ConfigSettings, ExtraBuildRequirement};
4
5/// A digest representing the build settings, such as build dependencies or other build-time
6/// configuration.
7#[derive(Default, Debug, Clone, Hash, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
8pub struct BuildInfo {
9    #[serde(default, skip_serializing_if = "ConfigSettings::is_empty")]
10    config_settings: ConfigSettings,
11    #[serde(default, skip_serializing_if = "Vec::is_empty")]
12    extra_build_requires: Vec<ExtraBuildRequirement>,
13    #[serde(default, skip_serializing_if = "BuildVariables::is_empty")]
14    extra_build_variables: BuildVariables,
15}
16
17impl CacheKey for BuildInfo {
18    fn cache_key(&self, state: &mut CacheKeyHasher) {
19        self.config_settings.cache_key(state);
20        self.extra_build_requires.cache_key(state);
21        self.extra_build_variables.cache_key(state);
22    }
23}
24
25impl BuildInfo {
26    /// Creates a [`BuildInfo`] instance with the given configuration settings, extra build
27    /// dependencies, and extra build variables.
28    pub fn from_settings(
29        config_settings: &ConfigSettings,
30        extra_build_dependencies: &[ExtraBuildRequirement],
31        extra_build_variables: Option<&BuildVariables>,
32    ) -> Self {
33        Self {
34            config_settings: config_settings.clone(),
35            extra_build_requires: extra_build_dependencies.to_vec(),
36            extra_build_variables: extra_build_variables.cloned().unwrap_or_default(),
37        }
38    }
39
40    /// Returns `true` if the [`BuildInfo`] is empty, meaning it has no configuration settings,
41    pub fn is_empty(&self) -> bool {
42        self.config_settings.is_empty()
43            && self.extra_build_requires.is_empty()
44            && self.extra_build_variables.is_empty()
45    }
46
47    /// Return the cache shard for this [`BuildInfo`].
48    pub fn cache_shard(&self) -> Option<String> {
49        if self.is_empty() {
50            None
51        } else {
52            Some(cache_digest(self))
53        }
54    }
55}