Skip to main content

ephemeris_forge_forgejo/
config.rs

1//! The desired Forgejo repository state.
2
3mod access;
4mod actions_variables;
5mod branch_rules;
6mod deploy_keys;
7mod labels;
8mod push_access;
9mod repository;
10mod tag_protection;
11mod webhooks;
12
13use facet::Facet;
14
15pub(crate) use self::access::Access;
16pub use self::actions_variables::ActionsVariables;
17pub use self::branch_rules::{BranchRule, BranchRules, InvalidRuleName, RuleName};
18pub use self::deploy_keys::{DeployKey, DeployKeys};
19pub use self::labels::Label;
20pub(crate) use self::labels::Labels;
21pub use self::push_access::PushAccess;
22pub use self::repository::{
23    ExternalTracker, ExternalWiki, InternalTracker, InvalidTopic, MergeStyle, Repository,
24    TopicName, TrackerStyle, UpdateStyle,
25};
26pub use self::tag_protection::{TagProtection, TagRule};
27pub use self::webhooks::{HookType, Webhook, Webhooks};
28
29/// A configuration document that describes one Forgejo repository.
30#[derive(Clone, Debug, Eq, Facet, PartialEq)]
31#[facet(deny_unknown_fields)]
32pub struct Config {
33    /// Settings for the repository itself.
34    pub repository: Repository,
35    /// Branch protection rules, when configured.
36    pub branch_rules: Option<BranchRules>,
37    /// Repository team grants, when configured.
38    pub access: Option<Access>,
39    /// Repository labels, when configured.
40    pub labels: Option<Labels>,
41    /// Tag protections keyed by name pattern, when configured.
42    pub tag_protection: Option<TagProtection>,
43    /// Repository webhooks, when configured.
44    pub webhooks: Option<Webhooks>,
45    /// Repository deploy keys, when configured.
46    pub deploy_keys: Option<DeployKeys>,
47    /// Repository Actions variables, when configured.
48    pub actions_variables: Option<ActionsVariables>,
49}
50
51#[cfg(test)]
52mod tests {
53    use super::Config;
54
55    #[test]
56    fn contract_example_decodes() {
57        let config: Config = facet_json::from_str(include_str!("../tests/data/settings.json"))
58            .expect("valid configuration");
59        assert_eq!(config.branch_rules.expect("managed").rules.len(), 1);
60    }
61
62    #[test]
63    fn an_unknown_merge_style_is_rejected() {
64        let input = include_str!("../tests/data/settings.json").replace(
65            "\"default_merge_style\": \"rebase\"",
66            "\"default_merge_style\": \"manual\"",
67        );
68        facet_json::from_str::<Config>(&input).expect_err("closed enum");
69    }
70}