git-next-core 0.14.1

core for git-next, the trunk-based development manager
Documentation
use std::collections::BTreeMap;

use crate::{
    config::{ApiToken, ForgeType, Hostname, RepoAlias, ServerRepoConfig, User},
    s,
};

use super::CommitCount;

/// Defines a Forge to connect to
/// Maps from `git-next-server.toml` at `forge.{forge}`
#[derive(
    Clone,
    Debug,
    derive_more::From,
    PartialEq,
    Eq,
    PartialOrd,
    Ord,
    serde::Deserialize,
    derive_more::Constructor,
    derive_more::Display,
)]
#[display("{}:{}@{}", s!(forge_type).to_lowercase(), user, hostname)]
pub struct ForgeConfig {
    forge_type: ForgeType,
    hostname: String,
    user: String,
    token: String,
    max_dev_commits: Option<u32>,
    repos: BTreeMap<String, ServerRepoConfig>,
}
impl ForgeConfig {
    pub(crate) const fn forge_type(&self) -> ForgeType {
        self.forge_type
    }

    pub(crate) fn hostname(&self) -> Hostname {
        Hostname::new(&self.hostname)
    }

    pub(crate) fn user(&self) -> User {
        User::new(self.user.clone())
    }

    pub(crate) fn token(&self) -> ApiToken {
        ApiToken::new(self.token.clone().into())
    }

    pub(crate) fn max_dev_commits(&self) -> Option<CommitCount> {
        self.max_dev_commits.map(CommitCount::from)
    }

    pub fn repos(&self) -> impl Iterator<Item = (RepoAlias, &ServerRepoConfig)> {
        self.repos
            .iter()
            .map(|(name, repo)| (RepoAlias::new(name), repo))
    }

    #[cfg(test)]
    #[must_use]
    pub fn get_repo(&self, arg: &str) -> Option<&ServerRepoConfig> {
        self.repos.get(arg)
    }
}