Skip to main content

releasaurus_core/
resolver.rs

1use derive_builder::Builder;
2use std::{collections::HashMap, rc::Rc};
3use url::Url;
4
5use crate::{
6    config::{
7        Config,
8        package::PackageConfig,
9        resolved::{
10            CommitModifiers, GlobalOverrides, PackageOverrides, ResolvedConfig,
11        },
12    },
13    packages::resolved_hash::ResolvedPackageHash,
14    resolver::resolvers::{
15        base_branch::resolve_base_branch,
16        commit_modifiers::resolve_commit_modifiers, package::resolve_package,
17    },
18    result::{ReleasaurusError, Result},
19};
20
21pub mod resolvers;
22
23#[derive(Builder)]
24#[builder(setter(into), build_fn(private, name = "_build"))]
25pub struct Resolver {
26    pub toml_config: Rc<Config>,
27    pub repo_name: String,
28    pub repo_default_branch: String,
29    pub release_link_base_url: Url,
30    pub compare_link_base_url: Url,
31    pub package_overrides: HashMap<String, PackageOverrides>,
32    pub global_overrides: GlobalOverrides,
33    pub commit_modifiers: CommitModifiers,
34}
35
36impl ResolverBuilder {
37    pub fn build(&self) -> Result<Resolver> {
38        self._build().map_err(|e| {
39            ReleasaurusError::invalid_config(format!(
40                "Failed to build resolver: {}",
41                e
42            ))
43        })
44    }
45}
46
47impl Resolver {
48    pub fn builder() -> ResolverBuilder {
49        ResolverBuilder::default()
50    }
51
52    pub fn resolve(
53        &self,
54        packages: Vec<PackageConfig>,
55    ) -> Result<(Rc<ResolvedConfig>, ResolvedPackageHash)> {
56        let base_branch = resolve_base_branch(
57            &self.toml_config,
58            &self.global_overrides,
59            &self.repo_default_branch,
60        );
61
62        let commit_modifiers = resolve_commit_modifiers(
63            &self.toml_config,
64            &self.commit_modifiers,
65        )?;
66
67        let resolved_config = Rc::new(ResolvedConfig {
68            auto_start_next: self.toml_config.auto_start_next,
69            base_branch,
70            breaking_always_increment_major: self
71                .toml_config
72                .breaking_always_increment_major,
73            changelog: self.toml_config.changelog.clone(),
74            commit_modifiers,
75            custom_major_increment_regex: self
76                .toml_config
77                .custom_major_increment_regex
78                .clone(),
79            custom_minor_increment_regex: self
80                .toml_config
81                .custom_minor_increment_regex
82                .clone(),
83            features_always_increment_minor: self
84                .toml_config
85                .features_always_increment_minor,
86            first_release_search_depth: self
87                .toml_config
88                .first_release_search_depth,
89            tag_search_depth: self.toml_config.tag_search_depth,
90            global_overrides: self.global_overrides.clone(),
91            package_overrides: self.package_overrides.clone(),
92            prerelease: self.toml_config.prerelease.clone(),
93            release_link_base_url: self.release_link_base_url.clone(),
94            compare_link_base_url: self.compare_link_base_url.clone(),
95            repo_name: self.repo_name.clone(),
96            separate_pull_requests: self.toml_config.separate_pull_requests,
97        });
98
99        let mut resolved_packages = vec![];
100
101        for package in packages {
102            let resolved_package =
103                resolve_package(Rc::clone(&resolved_config), package)?;
104
105            resolved_packages.push(resolved_package);
106        }
107
108        let resolved_hash = ResolvedPackageHash::new(resolved_packages)?;
109
110        Ok((resolved_config, resolved_hash))
111    }
112}