git_next_core/config/
forge_config.rs

1use std::collections::BTreeMap;
2
3use crate::{
4    config::{ApiToken, ForgeType, Hostname, RepoAlias, ServerRepoConfig, User},
5    s,
6};
7
8use super::CommitCount;
9
10/// Defines a Forge to connect to
11/// Maps from `git-next-server.toml` at `forge.{forge}`
12#[derive(
13    Clone,
14    Debug,
15    derive_more::From,
16    PartialEq,
17    Eq,
18    PartialOrd,
19    Ord,
20    serde::Deserialize,
21    derive_more::Constructor,
22    derive_more::Display,
23)]
24#[display("{}:{}@{}", s!(forge_type).to_lowercase(), user, hostname)]
25pub struct ForgeConfig {
26    forge_type: ForgeType,
27    hostname: String,
28    user: String,
29    token: String,
30    max_dev_commits: Option<u32>,
31    repos: BTreeMap<String, ServerRepoConfig>,
32}
33impl ForgeConfig {
34    pub(crate) const fn forge_type(&self) -> ForgeType {
35        self.forge_type
36    }
37
38    pub(crate) fn hostname(&self) -> Hostname {
39        Hostname::new(&self.hostname)
40    }
41
42    pub(crate) fn user(&self) -> User {
43        User::new(self.user.clone())
44    }
45
46    pub(crate) fn token(&self) -> ApiToken {
47        ApiToken::new(self.token.clone().into())
48    }
49
50    pub(crate) fn max_dev_commits(&self) -> Option<CommitCount> {
51        self.max_dev_commits.map(CommitCount::from)
52    }
53
54    pub fn repos(&self) -> impl Iterator<Item = (RepoAlias, &ServerRepoConfig)> {
55        self.repos
56            .iter()
57            .map(|(name, repo)| (RepoAlias::new(name), repo))
58    }
59
60    #[cfg(test)]
61    #[must_use]
62    pub fn get_repo(&self, arg: &str) -> Option<&ServerRepoConfig> {
63        self.repos.get(arg)
64    }
65}