releasaurus-core 0.20.4

A comprehensive release automation tool that streamlines the software release process across multiple programming languages and forge platforms
Documentation
use derive_builder::Builder;
use std::{collections::HashMap, rc::Rc};
use url::Url;

use crate::{
    config::{
        Config,
        package::PackageConfig,
        resolved::{
            CommitModifiers, GlobalOverrides, PackageOverrides, ResolvedConfig,
        },
    },
    packages::resolved_hash::ResolvedPackageHash,
    resolver::resolvers::{
        base_branch::resolve_base_branch,
        commit_modifiers::resolve_commit_modifiers, package::resolve_package,
    },
    result::{ReleasaurusError, Result},
};

pub mod resolvers;

#[derive(Builder)]
#[builder(setter(into), build_fn(private, name = "_build"))]
pub struct Resolver {
    pub toml_config: Rc<Config>,
    pub repo_name: String,
    pub repo_default_branch: String,
    pub release_link_base_url: Url,
    pub compare_link_base_url: Url,
    pub package_overrides: HashMap<String, PackageOverrides>,
    pub global_overrides: GlobalOverrides,
    pub commit_modifiers: CommitModifiers,
}

impl ResolverBuilder {
    pub fn build(&self) -> Result<Resolver> {
        self._build().map_err(|e| {
            ReleasaurusError::invalid_config(format!(
                "Failed to build resolver: {}",
                e
            ))
        })
    }
}

impl Resolver {
    pub fn builder() -> ResolverBuilder {
        ResolverBuilder::default()
    }

    pub fn resolve(
        &self,
        packages: Vec<PackageConfig>,
    ) -> Result<(Rc<ResolvedConfig>, ResolvedPackageHash)> {
        let base_branch = resolve_base_branch(
            &self.toml_config,
            &self.global_overrides,
            &self.repo_default_branch,
        );

        let commit_modifiers = resolve_commit_modifiers(
            &self.toml_config,
            &self.commit_modifiers,
        )?;

        let resolved_config = Rc::new(ResolvedConfig {
            auto_start_next: self.toml_config.auto_start_next,
            base_branch,
            breaking_always_increment_major: self
                .toml_config
                .breaking_always_increment_major,
            changelog: self.toml_config.changelog.clone(),
            commit_modifiers,
            custom_major_increment_regex: self
                .toml_config
                .custom_major_increment_regex
                .clone(),
            custom_minor_increment_regex: self
                .toml_config
                .custom_minor_increment_regex
                .clone(),
            features_always_increment_minor: self
                .toml_config
                .features_always_increment_minor,
            first_release_search_depth: self
                .toml_config
                .first_release_search_depth,
            tag_search_depth: self.toml_config.tag_search_depth,
            global_overrides: self.global_overrides.clone(),
            package_overrides: self.package_overrides.clone(),
            prerelease: self.toml_config.prerelease.clone(),
            release_link_base_url: self.release_link_base_url.clone(),
            compare_link_base_url: self.compare_link_base_url.clone(),
            repo_name: self.repo_name.clone(),
            separate_pull_requests: self.toml_config.separate_pull_requests,
        });

        let mut resolved_packages = vec![];

        for package in packages {
            let resolved_package =
                resolve_package(Rc::clone(&resolved_config), package)?;

            resolved_packages.push(resolved_package);
        }

        let resolved_hash = ResolvedPackageHash::new(resolved_packages)?;

        Ok((resolved_config, resolved_hash))
    }
}