diff --git a/src/config.rs b/src/config.rs index 734058a95..be0563a95 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,6 +23,8 @@ pub(crate) struct Config { pub(crate) prioritize: Option, pub(crate) major_change: Option, pub(crate) glacier: Option, + pub(crate) autolabel: Option, + pub(crate) notify_zulip: Option, } #[derive(PartialEq, Eq, Debug, serde::Deserialize)] @@ -79,11 +81,47 @@ pub(crate) struct RelabelConfig { #[derive(PartialEq, Eq, Debug, serde::Deserialize)] pub(crate) struct PrioritizeConfig { pub(crate) label: String, - #[serde(default)] - pub(crate) prioritize_on: Vec, +} + +#[derive(PartialEq, Eq, Debug, serde::Deserialize)] +pub(crate) struct AutolabelConfig { + #[serde(flatten)] + pub(crate) labels: HashMap, +} + +impl AutolabelConfig { + pub(crate) fn get_by_trigger(&self, trigger: &str) -> Vec<(&str, &AutolabelLabelConfig)> { + let mut results = Vec::new(); + for (label, cfg) in self.labels.iter() { + if cfg.trigger_labels.iter().any(|l| l == trigger) { + results.push((label.as_str(), cfg)); + } + } + results + } +} + +#[derive(PartialEq, Eq, Debug, serde::Deserialize)] +pub(crate) struct AutolabelLabelConfig { + pub(crate) trigger_labels: Vec, #[serde(default)] pub(crate) exclude_labels: Vec, +} + +#[derive(PartialEq, Eq, Debug, serde::Deserialize)] +pub(crate) struct NotifyZulipConfig { + #[serde(flatten)] + pub(crate) labels: HashMap, +} + +#[derive(PartialEq, Eq, Debug, serde::Deserialize)] +pub(crate) struct NotifyZulipLabelConfig { pub(crate) zulip_stream: u64, + pub(crate) topic: String, + pub(crate) message_on_add: Option, + pub(crate) message_on_remove: Option, + #[serde(default)] + pub(crate) required_labels: Vec, } #[derive(PartialEq, Eq, Debug, serde::Deserialize)] @@ -231,6 +269,8 @@ mod tests { prioritize: None, major_change: None, glacier: None, + autolabel: None, + notify_zulip: None, } ); } diff --git a/src/handlers.rs b/src/handlers.rs index 85d841c46..8b1e2e1dc 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -82,6 +82,8 @@ handlers! { major_change = major_change::MajorChangeHandler, //tracking_issue = tracking_issue::TrackingIssueHandler, glacier = glacier::GlacierHandler, + autolabel = autolabel::AutolabelHandler, + notify_zulip = notify_zulip::NotifyZulipHandler, } pub struct Context { diff --git a/src/handlers/autolabel.rs b/src/handlers/autolabel.rs new file mode 100644 index 000000000..f43d7de6c --- /dev/null +++ b/src/handlers/autolabel.rs @@ -0,0 +1,94 @@ +use crate::{ + config::AutolabelConfig, + github::{self, Event, Label}, + handlers::{Context, Handler}, +}; +use futures::future::{BoxFuture, FutureExt}; +pub(super) struct AutolabelInput { + labels: Vec