use std::collections::BTreeSet;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct EventToggles {
pub review_requested: bool,
pub re_review_requested: bool,
pub review_submitted: bool,
pub review_dismissed: bool,
pub comment_reply: bool,
pub mentioned: bool,
pub merged: bool,
pub closed: bool,
pub ready_for_review: bool,
}
impl Default for EventToggles {
fn default() -> Self {
Self {
review_requested: true,
re_review_requested: true,
review_submitted: true,
review_dismissed: true,
comment_reply: true,
mentioned: true,
merged: true,
closed: true,
ready_for_review: false,
}
}
}
impl EventToggles {
pub fn is_enabled(&self, tag: &str) -> bool {
match tag {
"review_requested" => self.review_requested,
"re_review_requested" => self.re_review_requested,
"review_submitted" => self.review_submitted,
"review_dismissed" => self.review_dismissed,
"comment_reply" => self.comment_reply,
"mentioned" => self.mentioned,
"merged" => self.merged,
"closed" => self.closed,
"ready_for_review" => self.ready_for_review,
_ => true,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct RepoFilter {
pub allow: Vec<String>,
pub deny: Vec<String>,
}
impl RepoFilter {
pub fn permits(&self, full_name: &str) -> bool {
if self.deny.iter().any(|p| pattern_matches(p, full_name)) {
return false;
}
if self.allow.is_empty() {
return true;
}
self.allow.iter().any(|p| pattern_matches(p, full_name))
}
}
fn pattern_matches(pattern: &str, full_name: &str) -> bool {
if let Some(owner_prefix) = pattern.strip_suffix("/*") {
full_name
.split_once('/')
.is_some_and(|(owner, _)| owner == owner_prefix)
} else {
pattern == full_name
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct QuietHours {
pub enabled: bool,
pub start: String,
pub end: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct MergeCloseScope {
pub author: bool,
pub reviewer: bool,
}
impl Default for MergeCloseScope {
fn default() -> Self {
Self {
author: true,
reviewer: true,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct RuleConfig {
pub events: EventToggles,
pub repos: RepoFilter,
pub mute_authors: BTreeSet<String>,
pub quiet_hours: QuietHours,
pub merge_close: MergeCloseScope,
}