uv_distribution_types/
build_info.rs1use uv_cache_key::{CacheKey, CacheKeyHasher, cache_digest};
2
3use crate::{BuildVariables, ConfigSettings, ExtraBuildRequirement};
4
5#[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 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 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 pub fn cache_shard(&self) -> Option<String> {
49 if self.is_empty() {
50 None
51 } else {
52 Some(cache_digest(self))
53 }
54 }
55}