releasaurus_core/
resolver.rs1use 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}